Commit f346fa0d authored by 3533457856@qq.com's avatar 3533457856@qq.com

发货单

新增/编辑/详情接口 更新发货单状态接口
parent 4d2f63b6
package com.yeejoin.amos.boot.module.hygf.api.Enum;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 发货单枚举
*
* @author Provence
* @version v1.0
* @date 2023/8/18 16:49
*/
public class PreparationMoneyEnum {
/**
* 订单状态
*
*/
@Getter
@AllArgsConstructor
public enum DOCUMENT_STATE {
未完成("未完成", "0", "未完成"),// 订单状态0未完成1已完成2作废
已完成("已完成", "1", "0"),//发货状态 0 未发货1已发货
作废("已作废", "2", "1");//到货状态0未到货1已到货
/**
* 名称,描述
*/
private String name;
/**
* 编码
*/
private String code;
/**
* 编码
*/
private String describe;
}
/**
* 发货状态
*
*/
@Getter
@AllArgsConstructor
public enum SHIPMENT_STATUS {
未发货("未发货", "0", "未发货"),// 订单状态0未完成1已完成2作废
已发货("已发货", "1", "已发货");//发货状态 0 未发货1已发货
/**
* 名称,描述
*/
private String name;
/**
* 编码
*/
private String code;
/**
* 编码
*/
private String describe;
}
/**
* 到货状态
*
*/
@Getter
@AllArgsConstructor
public enum RECEIVING_STATUS {
未到货("未到货", "0", "未到货"),// 订单状态0未完成1已完成2作废
已到货("已到货", "1", "已到货");//发货状态 0 未发货1已发货
/**
* 名称,描述
*/
private String name;
/**
* 编码
*/
private String code;
/**
* 编码
*/
private String describe;
}
/**
* 业主类型
*
*/
@Getter
@AllArgsConstructor
enum OWNER_TYPE {
document_state("未完成", "0", "未完成"),// 订单状态0未完成1已完成2作废
shipment_status("已完成", "1", "0"),//发货状态 0 未发货1已发货
receiving_status("作废", "2", "1");//到货状态0未到货1已到货
/**
* 名称,描述
*/
private String name;
/**
* 编码
*/
private String code;
/**
* 编码
*/
private String describe;
}
}
package com.yeejoin.amos.boot.module.hygf.api.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.yeejoin.amos.boot.biz.common.dto.BaseDto;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotEmpty;
import java.util.Date;
import java.util.List;
/**
* 发货单
......@@ -16,6 +23,7 @@ import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value="PreparationMoneyDto", description="发货单")
@JsonIgnoreProperties(ignoreUnknown = true)
public class PreparationMoneyDto extends BaseDto {
private static final long serialVersionUID = 1L;
......@@ -34,6 +42,7 @@ public class PreparationMoneyDto extends BaseDto {
private String orderUser;
@ApiModelProperty(value = "下单时间")
@JsonFormat (pattern="yyyy-MM-dd")
private Date orderTime;
@ApiModelProperty(value = "经销商id")
......@@ -43,7 +52,8 @@ public class PreparationMoneyDto extends BaseDto {
private String dealerName;
@ApiModelProperty(value = " 发货地址")
private String sendAddress;
@TableField (typeHandler = FastjsonTypeHandler.class)
private List<String> sendAddress;
@ApiModelProperty(value = " 业主类型")
private String ownerType;
......@@ -64,16 +74,19 @@ public class PreparationMoneyDto extends BaseDto {
private String consigneePhone;
@ApiModelProperty(value = "收货人地址")
private String consigneeAddress;
@TableField (typeHandler = FastjsonTypeHandler.class)
private List<String> consigneeAddress;
@ApiModelProperty(value = "收货人详细地址")
private String consigneeDetailAddress;
@ApiModelProperty(value = "发货单")
private String invoice;
@TableField(typeHandler = FastjsonTypeHandler.class)
private List<Object> invoice;
@ApiModelProperty(value = "收货单")
private String receipt;
@TableField(typeHandler = FastjsonTypeHandler.class)
private List<Object> receipt;
@ApiModelProperty(value = "订单状态0未完成1已完成2作废")
private String documentState;
......@@ -99,4 +112,14 @@ public class PreparationMoneyDto extends BaseDto {
@ApiModelProperty(value = "总价")
private Double totalPrice;
@ApiModelProperty(value = "到货时间")
@JsonFormat (pattern="yyyy-MM-dd")
private Date deliveryTime;
@ApiModelProperty(value = "发货电站列表")
@NotEmpty(message = "请选择发货电站")
private List<PeasantHouseholdDto> powerStations;
@ApiModelProperty(value = "BOM清单")
private List<DocumentBomDto> documentBoms;
}
......@@ -20,7 +20,7 @@ import java.util.List;
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("hygf_preparation_money")
@TableName(value="hygf_preparation_money",autoResultMap = true)
public class PreparationMoney extends BaseEntity {
private static final long serialVersionUID = 1L;
......@@ -70,8 +70,8 @@ public class PreparationMoney extends BaseEntity {
/**
* 发货地址
*/
@TableField("send_address")
private String sendAddress;
@TableField(value = "send_address",typeHandler = FastjsonTypeHandler.class,updateStrategy = FieldStrategy.IGNORED)
private List<Object> sendAddress;
/**
* 业主类型
......@@ -112,8 +112,8 @@ public class PreparationMoney extends BaseEntity {
/**
* 收货人地址
*/
@TableField("consignee_address")
private String consigneeAddress;
@TableField(value = "consignee_address",typeHandler = FastjsonTypeHandler.class)
private List<Object> consigneeAddress;
/**
* 收货人详细地址
......@@ -125,14 +125,14 @@ public class PreparationMoney extends BaseEntity {
* 发货单
*/
@TableField(value = "invoice",typeHandler = FastjsonTypeHandler.class,updateStrategy = FieldStrategy.IGNORED)
@TableField(value = "invoice",typeHandler = FastjsonTypeHandler.class)
private List<Object> invoice;
/**
* 收货单
*/
@TableField(value = "receipt",typeHandler = FastjsonTypeHandler.class,updateStrategy = FieldStrategy.IGNORED)
private String receipt;
private List<Object> receipt;
/**
* 订单状态0未完成1已完成2已作废
......@@ -182,4 +182,10 @@ public class PreparationMoney extends BaseEntity {
@TableField("total_price")
private Double totalPrice;
/**
* 到货时间
*/
@TableField("delivery_time")
private Date deliveryTime;
}
package com.yeejoin.amos.boot.module.hygf.api.service;
import com.yeejoin.amos.boot.module.hygf.api.dto.DocumentBomDto;
import java.util.List;
/**
* 发货单bom接口类
*
......@@ -9,4 +13,16 @@ package com.yeejoin.amos.boot.module.hygf.api.service;
*/
public interface IDocumentBomService {
/**
* 根据货单id查询BOM清单
*
*
* @param preparationMoneyId preparationMoneyId
* @return {@link java.util.List<com.yeejoin.amos.boot.module.hygf.api.dto.DocumentBomDto>}
* @author Provence
* @throws
* @date 2023/8/17 20:35
*/
List<DocumentBomDto> listByPreparationMoneyId(Long preparationMoneyId);
}
package com.yeejoin.amos.boot.module.hygf.api.service;
import com.yeejoin.amos.boot.module.hygf.api.dto.PreparationMoneyDto;
/**
* 发货单接口类
*
......@@ -9,4 +11,27 @@ package com.yeejoin.amos.boot.module.hygf.api.service;
*/
public interface IPreparationMoneyService {
/**
* 新增/更新发货单
*
*
* @param model dto
* @return {@link PreparationMoneyDto}
* @author Provence
* @throws
*/
PreparationMoneyDto saveOrUpdateObject(PreparationMoneyDto model);
/**
* 更新发货单状态
*
*
* @param sequenceNbr 发货单ID
* @param operationType 操作类型(RECEIPT-确认收货, DELIVERY-发货, DISCARD-废弃)
* @return {@link Boolean}
* @author Provence
* @throws
*/
Boolean updatePreparationMoneyStatus(Long sequenceNbr, String operationType);
}
......@@ -113,4 +113,21 @@ public class DocumentBomController extends BaseController {
public ResponseModel<List<DocumentBomDto>> selectForList() {
return ResponseHelper.buildResponse(documentBomServiceImpl.queryForDocumentBomList());
}
/**
* 根据货单id查询BOM清单
*
*
* @param preparationMoneyId preparationMoneyId
* @return {@link ResponseModel< List< DocumentBomDto>>}
* @author Provence
* @throws
* @date 2023/8/17 20:33
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(httpMethod = "GET",value = "根据货单id查询BOM清单", notes = "根据货单id查询BOM清单")
@GetMapping(value = "/listByPreparationMoneyId")
public ResponseModel<List<DocumentBomDto>> listByPreparationMoneyId(@RequestParam Long preparationMoneyId) {
return ResponseHelper.buildResponse(documentBomServiceImpl.listByPreparationMoneyId(preparationMoneyId));
}
}
......@@ -201,13 +201,14 @@ public class PeasantHouseholdController extends BaseController {
@ApiOperation(httpMethod = "GET",value = "农户信息分页查询", notes = "农户信息分页查询")
public ResponseModel<Page<PeasantHouseholdDto>> queryForPage(@RequestParam(value = "current") int current,
@RequestParam(value = "size") int size,
@RequestParam(value = "ownersName",required = false)String ownersName) {
@RequestParam(value = "ownersName",required = false)String ownersName,
@RequestParam(value = "developerId",required = false)Long developerId) {
Page<PeasantHouseholdDto> page = new Page<PeasantHouseholdDto>();
page.setCurrent(current);
page.setSize(size);
AgencyUserModel userInfo = getUserInfo();
String orgCode = userInfo.getCompanys().get(0).getOrgCode();
return ResponseHelper.buildResponse(peasantHouseholdServiceImpl.queryForPeasantHouseholdPage(page,orgCode,ownersName));
return ResponseHelper.buildResponse(peasantHouseholdServiceImpl.queryForPeasantHouseholdPage(page,orgCode,ownersName,developerId));
}
/**
......
package com.yeejoin.amos.boot.module.hygf.biz.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yeejoin.amos.boot.module.hygf.api.dto.PeasantHouseholdDto;
import com.yeejoin.amos.boot.module.hygf.api.dto.PreparationPageDto;
import com.yeejoin.amos.boot.module.hygf.api.entity.PreparationMoney;
import io.swagger.annotations.ApiModelProperty;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.Api;
......@@ -12,11 +13,14 @@ import com.yeejoin.amos.boot.biz.common.controller.BaseController;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
import com.yeejoin.amos.boot.module.hygf.biz.service.impl.PreparationMoneyServiceImpl;
import org.typroject.tyboot.core.restful.utils.ResponseHelper;
import org.typroject.tyboot.core.restful.utils.ResponseModel;
import org.springframework.beans.factory.annotation.Autowired;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yeejoin.amos.boot.module.hygf.api.dto.PreparationMoneyDto;
......@@ -45,8 +49,8 @@ public class PreparationMoneyController extends BaseController {
@TycloudOperation(ApiLevel = UserType.AGENCY)
@PostMapping(value = "/save")
@ApiOperation(httpMethod = "POST", value = "新增发货单", notes = "新增发货单")
public ResponseModel<PreparationMoneyDto> save(@RequestBody PreparationMoneyDto model) {
model = preparationMoneyServiceImpl.createWithModel(model);
public ResponseModel<PreparationMoneyDto> save(@Validated @RequestBody PreparationMoneyDto model) {
model = preparationMoneyServiceImpl.saveOrUpdateObject(model);
return ResponseHelper.buildResponse(model);
}
......@@ -61,7 +65,7 @@ public class PreparationMoneyController extends BaseController {
@ApiOperation(httpMethod = "PUT", value = "根据sequenceNbr更新发货单", notes = "根据sequenceNbr更新发货单")
public ResponseModel<PreparationMoneyDto> updateBySequenceNbrPreparationMoney(@RequestBody PreparationMoneyDto model,@PathVariable(value = "sequenceNbr") Long sequenceNbr) {
model.setSequenceNbr(sequenceNbr);
return ResponseHelper.buildResponse(preparationMoneyServiceImpl.updateWithModel(model));
return ResponseHelper.buildResponse(preparationMoneyServiceImpl.saveOrUpdateObject(model));
}
/**
......@@ -120,4 +124,55 @@ public class PreparationMoneyController extends BaseController {
public ResponseModel<List<PreparationMoneyDto>> selectForList() {
return ResponseHelper.buildResponse(preparationMoneyServiceImpl.queryForPreparationMoneyList());
}
/**
* 发货价格中金额列联动接口
*
* -根据发货电站表单传入的场站ID 查询数据然后计算相应的金额
*
*
* @param
* @return {@link ResponseModel< List< PreparationMoneyDto>>}
* @author Provence
* @throws
* @date 2023/8/17 18:23
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@PostMapping(value = "/getShippingPrice")
@ApiOperation(httpMethod = "POST", value = "发货价格数据查询", notes = "发货价格数据查询")
public ResponseModel<PreparationMoneyDto> getShippingPrice(@RequestBody List<PeasantHouseholdDto> dtos) {
List<Long> powerHouseholdIds = dtos.stream().map(PeasantHouseholdDto::getSequenceNbr).collect(Collectors.toList());
return ResponseHelper.buildResponse(preparationMoneyServiceImpl.caculateShippingPriceByPowerHouseHoldIds(powerHouseholdIds));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@PostMapping(value = "/getShippingPricev")
@ApiOperation(httpMethod = "POST", value = "发货价格数据查询-for test", notes = "发货价格数据查询2")
public ResponseModel<Double> getShippingPricev(@RequestBody List<PeasantHouseholdDto> dtos) {
List<Long> powerHouseholdIds = dtos.stream().map(PeasantHouseholdDto::getSequenceNbr).collect(Collectors.toList());
return ResponseHelper.buildResponse(preparationMoneyServiceImpl.caculateShippingPriceByPowerHouseHoldIds(powerHouseholdIds).getInventoryPrice());
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@GetMapping(value = "/detail")
@ApiOperation(httpMethod = "GET", value = "根据sequenceNbr查询单个发货单详情", notes = "根据sequenceNbr查询单个发货单详情")
public ResponseModel<PreparationMoneyDto> getObject(@RequestParam Long sequenceNbr) {
return ResponseHelper.buildResponse(preparationMoneyServiceImpl.getObjectBySequenceNbr(sequenceNbr));
}
/**
* 根据sequenceNbr更新
*
* @param sequenceNbr 主键
* @return
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@PostMapping(value = "/updatePreparationMoneyStatus")
@ApiOperation(httpMethod = "POST", value = "根据sequenceNbr更新发货单", notes = "根据sequenceNbr更新发货单")
public ResponseModel<Boolean> updateBySequenceNbr(@RequestParam(value = "sequenceNbr") Long sequenceNbr, @RequestParam(value = "operationType") String operationType) {
return ResponseHelper.buildResponse(preparationMoneyServiceImpl.updatePreparationMoneyStatus(sequenceNbr, operationType));
}
}
package com.yeejoin.amos.boot.module.hygf.biz.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.yeejoin.amos.boot.module.hygf.api.entity.DesignInformation;
import com.yeejoin.amos.boot.module.hygf.api.entity.DocumentBom;
import com.yeejoin.amos.boot.module.hygf.api.mapper.DocumentBomMapper;
import com.yeejoin.amos.boot.module.hygf.api.service.IDocumentBomService;
import com.yeejoin.amos.boot.module.hygf.api.dto.DocumentBomDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 发货单bom服务实现类
......@@ -17,6 +30,15 @@ import java.util.List;
*/
@Service
public class DocumentBomServiceImpl extends BaseService<DocumentBomDto,DocumentBom,DocumentBomMapper> implements IDocumentBomService {
/**
* 折扣率
*/
private final static double DISCOUNT_RATE = 1;
@Autowired
DesignInformationServiceImpl designInformationService;
/**
* 分页查询
*/
......@@ -30,4 +52,82 @@ public class DocumentBomServiceImpl extends BaseService<DocumentBomDto,DocumentB
public List<DocumentBomDto> queryForDocumentBomList() {
return this.queryForList("" , false);
}
@Override
public List<DocumentBomDto> listByPreparationMoneyId(Long preparationMoneyId) {
return this.queryForList("", false, preparationMoneyId);
}
public List<DocumentBom> assembleDocumentBom(List<Long> powerHouseholdIds) {
// hygf_design_information
List<DesignInformation> designInformations = designInformationService.query().in("peasant_household_id", powerHouseholdIds).list();
// [{"wlbm":"1","Symbol_key":"B1F7FEE3-9377-4A42-81FB-DEB8775EF67C","wlmc":"1","dcpgg":"1"}]
// 组件-assembly, 逆变器-inverter,电表箱-electricity_meter 根据物料编码 分组
List<DocumentBom> documentBoms = new ArrayList<>();
for (DesignInformation designInformation : designInformations) {
documentBoms.addAll(convertBom(designInformation.getAssembly(), "assembly"));
documentBoms.addAll(convertBom(designInformation.getInverter(), "inverter"));
documentBoms.addAll(convertBom(designInformation.getElectricityMeter(), "electricityMeter"));
}
// 根据物料编码 分组
return documentBoms.stream().collect(Collectors.groupingBy(DocumentBom::getMaterialNum)).values().stream()
.flatMap(list -> Stream.of(list.stream().reduce((o1, o2) -> {
o1.setDemandNumber(o1.getDemandNumber() + o2.getDemandNumber());
o1.setDiscountTotal(caculateDiscountTotal(o1).add(caculateDiscountTotal(o2)).doubleValue());
o1.setDiscountUnitPrice(caculateDiscountUnitPrice(o1).add(caculateDiscountUnitPrice(o2)).doubleValue());
return o1;
}).orElse(null)).filter(Objects::nonNull)).collect(Collectors.toList());
}
private BigDecimal caculateTotal(DocumentBom o1) {
return new BigDecimal(o1.getDemandNumber()).multiply(new BigDecimal(o1.getUnitPrice()));
}
private BigDecimal caculateDiscountTotal(DocumentBom o1) {
// 折扣总额 = 总价 - 折扣总价
return caculateTotal(o1).subtract(new BigDecimal(o1.getDemandNumber()).multiply(caculateDiscountUnitPrice(o1)));
}
private BigDecimal caculateDiscountUnitPrice(DocumentBom o1) {
// 折扣后单价 = 单价 * 折扣率
return new BigDecimal(o1.getUnitPrice()).multiply(new BigDecimal(DISCOUNT_RATE));
}
/**
* 设计信息内的组件-assembly, 逆变器-inverter,电表箱-electricity_meter json转成bom清单对象
*
*
* @param objects objects
* @param materialType materialType
* @return {@link List< DocumentBom>}
* @author Provence
* @throws
*/
private List<DocumentBom> convertBom(List<Object> objects, String materialType) {
if (CollectionUtils.isEmpty(objects)) {
return Collections.EMPTY_LIST;
}
List<DocumentBom> documentBoms = new ArrayList<>();
JSONArray jsonArray = JSONArray.parseArray(objects.toString());
for (int i = 0; i < jsonArray.size(); i++) {
DocumentBom documentBom = new DocumentBom();
JSONObject json = jsonArray.getJSONObject(i);
Integer demandNumber = json.getInteger("pzsl");//配置数量
String materialNum = json.getString("wlbm");//物料编码
String materialName = json.getString("wlmc");//物料名称
Double power = Double.valueOf(Optional.ofNullable(json.getString("gl")).orElse("0").replace("W", ""));// 去掉功率的单位
Double price = json.getDouble("price");//价格
documentBom.setMaterialNum(materialNum);//物料编码
documentBom.setMaterialName(materialName);//物料名称
documentBom.setUnitPrice(price);
documentBom.setDemandNumber(demandNumber);
documentBom.setPower(power);
/*
类型和分组目前没有该字段
documentBom.setMaterialType(materialType);
documentBom.setMaterialGroup();*/
documentBoms.add(documentBom);
}
return documentBoms;
}
}
\ No newline at end of file
......@@ -73,8 +73,8 @@ public class PeasantHouseholdServiceImpl extends BaseService<PeasantHouseholdDto
/**
* 分页查询
*/
public Page<PeasantHouseholdDto> queryForPeasantHouseholdPage(Page<PeasantHouseholdDto> page,String developerCode,@Condition(Operator.like) String ownersName) {
Page<PeasantHouseholdDto> peasantHouseholdDtoPage = this.queryForPage(page, "rec_date", false,developerCode,ownersName);
public Page<PeasantHouseholdDto> queryForPeasantHouseholdPage(Page<PeasantHouseholdDto> page,String developerCode,@Condition(Operator.like) String ownersName,Long developerId) {
Page<PeasantHouseholdDto> peasantHouseholdDtoPage = this.queryForPage(page, "rec_date", false,developerCode,ownersName,developerId);
List<PeasantHouseholdDto> records = peasantHouseholdDtoPage.getRecords();
List<PeasantHouseholdDto> newRecords = records.stream().map(item -> {
if(item.getSurveyOrNot() != null){
......
package com.yeejoin.amos.boot.module.hygf.biz.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yeejoin.amos.boot.module.hygf.api.Enum.PreparationMoneyEnum;
import com.yeejoin.amos.boot.module.hygf.api.dto.PeasantHouseholdDto;
import com.yeejoin.amos.boot.module.hygf.api.dto.PreparationPageDto;
import com.yeejoin.amos.boot.module.hygf.api.entity.DocumentBom;
import com.yeejoin.amos.boot.module.hygf.api.entity.DocumentStation;
import com.yeejoin.amos.boot.module.hygf.api.entity.PeasantHousehold;
import com.yeejoin.amos.boot.module.hygf.api.entity.PreparationMoney;
import com.yeejoin.amos.boot.module.hygf.api.entity.UnitInfo;
import com.yeejoin.amos.boot.module.hygf.api.mapper.PreparationMoneyMapper;
import com.yeejoin.amos.boot.module.hygf.api.service.IPreparationMoneyService;
import com.yeejoin.amos.boot.module.hygf.api.dto.PreparationMoneyDto;
import com.yeejoin.amos.component.robot.AmosRequestContext;
import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.typroject.tyboot.core.foundation.exception.BaseException;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* 发货单服务实现类
......@@ -27,9 +45,18 @@ public class PreparationMoneyServiceImpl extends BaseService<PreparationMoneyDto
@Autowired
private PreparationMoneyMapper preparationMoneyMapper;
@Autowired
private PowerStationServiceImpl powerStationService;
@Autowired
private PeasantHouseholdServiceImpl peasantHouseholdService;
@Autowired
private DocumentBomServiceImpl documentBomService;
@Autowired
private DocumentStationServiceImpl documentStationService;
@Autowired
private AmosRequestContext amosRequestContext;
@Autowired
private UnitInfoServiceImpl unitInfoService;
/**
* 分页查询
*/
......@@ -62,4 +89,190 @@ public class PreparationMoneyServiceImpl extends BaseService<PreparationMoneyDto
public List<PreparationMoneyDto> queryForPreparationMoneyList() {
return this.queryForList("" , false);
}
/**
* 获取发货单详情 by sequenceNbr
*
*
* @param sequenceNbr sequenceNbr
* @return {@link PreparationMoneyDto}
* @author Provence
* @throws
*/
public PreparationMoneyDto getObjectBySequenceNbr(Long sequenceNbr) {
PreparationMoneyDto preparationMoneyDto = this.queryBySeq(sequenceNbr);
// 加载BOM清单数据
preparationMoneyDto.setDocumentBoms(documentBomService.listByPreparationMoneyId(sequenceNbr));
// 加载发货电站数据
List<Long> peasantHouseholdIds = documentStationService.list(new LambdaQueryWrapper<DocumentStation>()
.select(DocumentStation::getStationId)
.eq(DocumentStation::getPreparationMoneyId, sequenceNbr))
.stream().map(DocumentStation::getStationId).collect(Collectors.toList());
List<PeasantHousehold> peasantHouseholds = (List<PeasantHousehold>) peasantHouseholdService.listByIds(peasantHouseholdIds);
preparationMoneyDto.setPowerStations(peasantHouseholds.stream().map(o -> {
PeasantHouseholdDto dto = new PeasantHouseholdDto();
BeanUtils.copyProperties(o, dto);
return dto;
}).collect(Collectors.toList()));
return preparationMoneyDto;
}
/**
* 保存或更新发货单
*
*
* @param model model
* @return {@link PreparationMoneyDto}
* @author Provence
* @throws
*/
@Transactional
@Override
public PreparationMoneyDto saveOrUpdateObject(PreparationMoneyDto model) {
boolean isUpdate = false;
if (model.getSequenceNbr() != null) {
// update
PreparationMoney entity = this.getById(model);
if (entity == null) {
throw new RuntimeException("发货单不存在");
}
isUpdate = true;
}
// BOM 清单 后台查询数据库整合数据
List<PeasantHouseholdDto> powerStations = Optional.ofNullable(model.getPowerStations()).orElseGet(ArrayList::new);
List<Long> powerHouseholdIds = powerStations.stream().map(PeasantHouseholdDto::getSequenceNbr).collect(Collectors.toList());
List<DocumentBom> documentBoms = documentBomService.assembleDocumentBom(powerHouseholdIds);
if (CollectionUtils.isEmpty(documentBoms)) {
// throw new BaseException("BOM清单为空", "400", "BOM清单为空");// 这里阻塞前端接口
// 根据发货电站信息无法组装成BOM清单
throw new RuntimeException("BOM清单为空");
}
PreparationMoneyDto pmd = caculateShippingPrice(documentBoms);
model.setInventoryPrice(pmd.getInventoryPrice());//清单价格
model.setDiscount(pmd.getDiscount());//折扣
model.setPromotion(pmd.getPromotion());//促销
model.setTotalPrice(pmd.getTotalPrice());
// 前端传值改动太大, 从数据库获取dealerName
LambdaQueryWrapper<UnitInfo> unitInfoque = new LambdaQueryWrapper<>();
unitInfoque.eq(UnitInfo::getAmosCompanySeq, model.getDealerId());
String dealerName = Optional.ofNullable(unitInfoService.query().getBaseMapper().selectOne(unitInfoque)).map(UnitInfo::getName).orElse(null);
model.setDealerName(dealerName);
// model.setContractPrice(pmd.getContractPrice());//合同价格
PreparationMoney entity = new PreparationMoney() ;
if (!isUpdate) {
// 初始化状态
model.setReceivingStatus(PreparationMoneyEnum.RECEIVING_STATUS.未到货.getName());
model.setShipmentStatus(PreparationMoneyEnum.SHIPMENT_STATUS.未发货.getName());
model.setDocumentState(PreparationMoneyEnum.DOCUMENT_STATE.未完成.getName());
}
BeanUtils.copyProperties(model, entity);
this.saveOrUpdate(entity);
documentBoms.stream().forEach(d -> d.setPreparationMoneyId(entity.getSequenceNbr()));
List<DocumentStation> documentStations = powerStations.stream().map(o -> buildDocumentStations(entity.getSequenceNbr(), o)).collect(Collectors.toList());
if (isUpdate) {
documentBomService.remove(new LambdaQueryWrapper<DocumentBom>().select(DocumentBom::getSequenceNbr).eq(DocumentBom::getPreparationMoneyId, entity.getSequenceNbr()));
documentStationService.remove(new LambdaQueryWrapper<DocumentStation>().select(DocumentStation::getSequenceNbr).eq(DocumentStation::getPreparationMoneyId, entity.getSequenceNbr()));
}
documentBomService.saveOrUpdateBatch(documentBoms);
documentStationService.saveOrUpdateBatch(documentStations);
return model;
}
private DocumentStation buildDocumentStations(Long sequenceNbr, PeasantHouseholdDto dto) {
String recUserId = amosRequestContext.getUserId();
String recUserName = amosRequestContext.getUserName();
DocumentStation documentStation = new DocumentStation();
documentStation.setPreparationMoneyId(sequenceNbr);
documentStation.setStationId(dto.getSequenceNbr());
documentStation.setRecUserId(recUserId);
documentStation.setRecUserName(recUserName);
return documentStation;
}
/**
* 更新发货单状态
*
*
* @param sequenceNbr 发货单ID
* @param operationType 操作类型(RECEIPT-确认收货, DELIVERY-发货, DISCARD-废弃)
* @return {@link Boolean}
* @author Provence
* @throws
*/
@Override
public Boolean updatePreparationMoneyStatus(Long sequenceNbr, String operationType) {
PreparationMoney preparationMoney = preparationMoneyMapper.selectById(sequenceNbr);
if (preparationMoney == null) {
throw new RuntimeException("订单不存在");
}
switch (operationType) {
case "RECEIPT":
// 确认收货 -> 到货状态 -> 已到货 -> 订单状态改为 已完成
if (!PreparationMoneyEnum.SHIPMENT_STATUS.已发货.getName().equals(preparationMoney.getShipmentStatus())) {
throw new RuntimeException("订单未发货, 无法确认收货");
}
preparationMoney.setReceivingStatus(PreparationMoneyEnum.RECEIVING_STATUS.已到货.getName());
preparationMoney.setDocumentState(PreparationMoneyEnum.DOCUMENT_STATE.已完成.getName());
preparationMoney.setDeliveryTime(new Date());
break;
case "DELIVERY":
// 发货 -> 发货状态 -> 已发货
preparationMoney.setShipmentStatus(PreparationMoneyEnum.SHIPMENT_STATUS.已发货.getName());
break;
case "DISCARD":
// 作废
// 订单状态 -> 已废弃
if (PreparationMoneyEnum.RECEIVING_STATUS.已到货.getName().equals(preparationMoney.getReceivingStatus())) {
throw new RuntimeException("订单已到货, 无法作废");
}
preparationMoney.setDocumentState(PreparationMoneyEnum.DOCUMENT_STATE.作废.getName());
break;
default:
break;
}
return preparationMoneyMapper.updateById(preparationMoney) > 0;
}
/**
* 根据前端选择的发货电站ID列表计算BOM清单价格
*
*
* @param powerHouseholdIds 发货电站ID
* @return {@link PreparationMoneyDto}
* @author Provence
* @throws
*/
public PreparationMoneyDto caculateShippingPriceByPowerHouseHoldIds(List<Long> powerHouseholdIds) {
List<DocumentBom> documentBoms = documentBomService.assembleDocumentBom(powerHouseholdIds);
return caculateShippingPrice(documentBoms);
}
/**
* 根据前端选择的发货电站ID列表计算BOM清单价格
*
*
* @param documentBoms BOM清单
* @return {@link PreparationMoneyDto}
* @author Provence
* @throws
*/
public PreparationMoneyDto caculateShippingPrice(List<DocumentBom> documentBoms) {
// 获取BOM清单数据
// 单价 * 经销商折扣 * 促销 * 需求数量
BigDecimal totalPrice = new BigDecimal(0);
BigDecimal totaldemandNumber = new BigDecimal(0);
for (DocumentBom documentBom : documentBoms) {
BigDecimal unitPrice = new BigDecimal(documentBom.getUnitPrice() == null?0:documentBom.getUnitPrice());//单价
BigDecimal demandNumber = new BigDecimal(documentBom.getDemandNumber());//需求数量
totalPrice = totalPrice.add(unitPrice.multiply(demandNumber));
totaldemandNumber = totaldemandNumber.add(demandNumber);
}
PreparationMoneyDto preparationMoneyDto = new PreparationMoneyDto();
preparationMoneyDto.setInventoryPrice(totalPrice.divide(totaldemandNumber).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue());//清单价格
preparationMoneyDto.setDiscount(0D);//折扣
preparationMoneyDto.setPromotion(0D);//促销
preparationMoneyDto.setContractPrice(0D);//合同价格 == 确认
preparationMoneyDto.setTotalPrice(totalPrice.doubleValue());
return preparationMoneyDto;
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment