From 1030034e419d3f5822bc1a8daaa49056531e9791 Mon Sep 17 00:00:00 2001 From: wangqiong <1322446236@qq.com> Date: Thu, 25 Jul 2024 17:39:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=A0=87=E5=87=86=E6=88=90?= =?UTF-8?q?=E6=9C=AC=E8=AE=A1=E7=AE=97=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/AppSceneCostResultValue.java | 107 ++-- .../kn/cost/manage/enums/FeeTypeEnum.java | 58 +++ .../cost/manage/enums/StandardStageEnum.java | 27 +- .../manage/mapper/CostMaterialBomMapper.java | 5 + .../manage/plugin/StandardCostService.java | 489 ++++++++++++++++++ .../plugin/laborcost/LaborCostTask.java | 2 +- .../ManufacturingCostTask.java | 10 +- .../plugin/materialcost/MaterialCostTask.java | 14 +- .../materialinput/MaterialInputTask.java | 1 + .../materialinput/StandardCostService.java | 169 ------ .../plugin/standardcost/StandardCostTask.java | 5 +- .../service/CostPurchasePriceService.java | 10 +- .../IAppSceneCostResultValueService.java | 2 +- .../AppSceneCostResultValueServiceImpl.java | 3 + .../impl/CostPurchasePriceServiceImpl.java | 33 +- .../kn/cost/manage/vo/FlowTaskInfoVO.java | 37 ++ 16 files changed, 726 insertions(+), 246 deletions(-) create mode 100644 qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/enums/FeeTypeEnum.java create mode 100644 qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/StandardCostService.java delete mode 100644 qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/materialinput/StandardCostService.java create mode 100644 qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/vo/FlowTaskInfoVO.java diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/entity/AppSceneCostResultValue.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/entity/AppSceneCostResultValue.java index 5719301..b431044 100644 --- a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/entity/AppSceneCostResultValue.java +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/entity/AppSceneCostResultValue.java @@ -1,28 +1,25 @@ package com.zzsmart.qomo.kn.cost.manage.entity; -import java.io.Serializable; -import java.io.UnsupportedEncodingException; -import java.util.Date; -import java.math.BigDecimal; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.annotation.TableLogic; -import lombok.Builder; -import lombok.Data; import com.fasterxml.jackson.annotation.JsonFormat; -import org.springframework.format.annotation.DateTimeFormat; -import org.jeecgframework.poi.excel.annotation.Excel; -import org.jeecg.common.aspect.annotation.Dict; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; /** * @Description: app_scene_cost_result_value * @Author: jeecg-boot - * @Date: 2024-07-23 + * @Date: 2024-07-25 * @Version: V1.0 */ @Data @@ -30,48 +27,92 @@ import lombok.experimental.Accessors; @TableName("app_scene_cost_result_value") @Accessors(chain = true) @EqualsAndHashCode(callSuper = false) -@ApiModel(value="app_scene_cost_result_value对象", description="app_scene_cost_result_value") +@ApiModel(value = "app_scene_cost_result_value对象", description = "app_scene_cost_result_value") public class AppSceneCostResultValue implements Serializable { private static final long serialVersionUID = 1L; - /**主键*/ - @TableId(type = IdType.ASSIGN_ID) + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) @ApiModelProperty(value = "主键") private Integer id; - /**所属最上级物料号*/ - @Excel(name = "所属最上级物料号", width = 15) + /** + * 所属最上级物料号 + */ + @Excel(name = "所属最上级物料号", width = 15) @ApiModelProperty(value = "所属最上级物料号") private String belongTopMaterialNo; - /**物料编号*/ - @Excel(name = "物料编号", width = 15) + /** + * 物料编号 + */ + @Excel(name = "物料编号", width = 15) @ApiModelProperty(value = "物料编号") private String marterialNo; - /**父类物料编号*/ - @Excel(name = "父类物料编号", width = 15) + /** + * 父类物料编号 + */ + @Excel(name = "父类物料编号", width = 15) @ApiModelProperty(value = "父类物料编号") private String parentMarterialNo; - /**任务类型*/ - @Excel(name = "任务类型", width = 15) + /** + * 数量 + */ + @Excel(name = "数量", width = 15) + @ApiModelProperty(value = "数量") + private Integer num; + /** + * 单位 + */ + @Excel(name = "单位", width = 15) + @ApiModelProperty(value = "单位") + private String unit; + /** + * 任务类型 + */ + @Excel(name = "任务类型", width = 15) @ApiModelProperty(value = "任务类型") private String taskType; - /**任务代码*/ - @Excel(name = "任务代码", width = 15) + /** + * 任务代码 + */ + @Excel(name = "任务代码", width = 15) @ApiModelProperty(value = "任务代码") private String taskCode; - /**流程id*/ - @Excel(name = "流程id", width = 15) + /** + * 流程id + */ + @Excel(name = "流程id", width = 15) @ApiModelProperty(value = "流程id") private String flowInstanceId; - /**计算结果值(多个值通过字段拼接)*/ - @Excel(name = "计算结果值(多个值通过字段拼接)", width = 15) - @ApiModelProperty(value = "计算结果值(多个值通过字段拼接)") + /** + * 本阶成本 + */ + @Excel(name = "本阶成本", width = 15) + @ApiModelProperty(value = "本阶成本") private String countValue; - /**创建时间*/ - @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") - @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + /** + * 创建时间 + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ApiModelProperty(value = "创建时间") private Date createTime; - /**创建人*/ + /** + * 创建人 + */ @ApiModelProperty(value = "创建人") private Integer createBy; + /** + * 总计成本 + */ + @Excel(name = "总计成本", width = 15) + @ApiModelProperty(value = "总计成本") + private String totalValue; + /** + * 成本类别 + */ + @Excel(name = "成本类别", width = 15) + @ApiModelProperty(value = "成本类别") + private String costType; } diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/enums/FeeTypeEnum.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/enums/FeeTypeEnum.java new file mode 100644 index 0000000..7573e85 --- /dev/null +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/enums/FeeTypeEnum.java @@ -0,0 +1,58 @@ +package com.zzsmart.qomo.kn.cost.manage.enums; + +/** + * @Classname StandardStageEnum + * @Description 阶段枚举 + * @Version 1.0.0 + * @Date 2024/6/18 9:51 + * @Created wangqiong + */ +public enum FeeTypeEnum { + EquipmentFee("EquipmentFee", "机器折旧费"), SupplyMaterialFee("SupplyMaterialFee", "辅料费"), DriverFee("DriverFee", "水电费"), OtherFee("OtherFee", "其他费用"), LogisticsFee("LogisticsFee", "物流费"); + + private final String code; + private final String text; + + FeeTypeEnum(String code, String text) { + this.code = code; + this.text = text; + } + + public String getCode() { + return code; + } + + public String getText() { + return text; + } + + /** + * 根据code获取text + * + * @param codeNo + * @return + */ + public static String getTextByCode(String codeNo) { + for (FeeTypeEnum value : FeeTypeEnum.values()) { + if (value.getCode().equals(codeNo)) { + return value.getText(); + } + } + return codeNo.toString(); + } + + /** + * 根据text获取code + * + * @param textStr + * @return + */ + public static String getCodeByText(String textStr) { + for (FeeTypeEnum value : FeeTypeEnum.values()) { + if (value.getText().equals(textStr)) { + return value.getText(); + } + } + return textStr; + } +} diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/enums/StandardStageEnum.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/enums/StandardStageEnum.java index 1efa289..59f5db1 100644 --- a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/enums/StandardStageEnum.java +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/enums/StandardStageEnum.java @@ -8,39 +8,33 @@ package com.zzsmart.qomo.kn.cost.manage.enums; * @Created wangqiong */ public enum StandardStageEnum { - INIT("A", "初始"), - FIRST_BATCH("B", "首批"), - MASS_PRODUCTION("C", "量产"), - - - ; + INIT("A", "初始"), FIRST_BATCH("B", "首批"), MASS_PRODUCTION("C", "量产"); private final String code; private final String text; - StandardStageEnum(String code, String text) - { + StandardStageEnum(String code, String text) { this.code = code; this.text = text; } - public String getCode() - { + public String getCode() { return code; } - public String getText() - { + public String getText() { return text; } + /** * 根据code获取text + * * @param codeNo * @return */ - public static String getTextByCode(String codeNo){ + public static String getTextByCode(String codeNo) { for (StandardStageEnum value : StandardStageEnum.values()) { - if (value.getCode().equals(codeNo)){ + if (value.getCode().equals(codeNo)) { return value.getText(); } } @@ -49,12 +43,13 @@ public enum StandardStageEnum { /** * 根据text获取code + * * @param textStr * @return */ - public static String getCodeByText(String textStr){ + public static String getCodeByText(String textStr) { for (StandardStageEnum value : StandardStageEnum.values()) { - if (value.getText().equals(textStr)){ + if (value.getText().equals(textStr)) { return value.getText(); } } diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/mapper/CostMaterialBomMapper.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/mapper/CostMaterialBomMapper.java index c8a7bb5..dde17c1 100644 --- a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/mapper/CostMaterialBomMapper.java +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/mapper/CostMaterialBomMapper.java @@ -1,5 +1,6 @@ package com.zzsmart.qomo.kn.cost.manage.mapper; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.zzsmart.qomo.kn.cost.manage.entity.CostMaterialBom; import org.apache.ibatis.annotations.Mapper; @@ -26,4 +27,8 @@ public interface CostMaterialBomMapper extends BaseMapper { */ @Select("${selectCommand}") List customSelect(@Param("selectCommand") String selectCommand); + + + @Select("${selectSql}") + JSONObject customSelectOne(@Param("selectSql") String selectSql); } diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/StandardCostService.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/StandardCostService.java new file mode 100644 index 0000000..a45f8a9 --- /dev/null +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/StandardCostService.java @@ -0,0 +1,489 @@ +package com.zzsmart.qomo.kn.cost.manage.plugin; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.zzsmart.qomo.dao.entity.FlowDefinition; +import com.zzsmart.qomo.kn.cost.manage.entity.AppSceneCostResultValue; +import com.zzsmart.qomo.kn.cost.manage.entity.CostMaterialBom; +import com.zzsmart.qomo.kn.cost.manage.entity.CostMaterialProcessHours; +import com.zzsmart.qomo.kn.cost.manage.entity.HourRate; +import com.zzsmart.qomo.kn.cost.manage.enums.FeeTypeEnum; +import com.zzsmart.qomo.kn.cost.manage.mapper.CostMaterialBomMapper; +import com.zzsmart.qomo.kn.cost.manage.service.CostMaterialProcessHoursService; +import com.zzsmart.qomo.kn.cost.manage.service.CostPurchasePriceService; +import com.zzsmart.qomo.kn.cost.manage.service.IAppSceneCostResultValueService; +import com.zzsmart.qomo.kn.cost.manage.service.IHourRateService; +import com.zzsmart.qomo.kn.cost.manage.vo.FlowTaskInfoVO; +import com.zzsmart.qomo.plugin.task.api.TaskExecutionContext; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +@Slf4j +public class StandardCostService { + /** + * 物料BOM信息 + */ + @Autowired + CostMaterialBomMapper costMaterialBomMapper; + + /** + * 小时费率 + */ + @Autowired + IHourRateService iHourRateService; + /** + * 采购单价 + */ + @Autowired + CostPurchasePriceService costPurchasePriceService; + /** + * 工序 + */ + @Autowired + CostMaterialProcessHoursService costMaterialProcessHoursService; + /** + * 标准成本计算结果 + */ + @Autowired + IAppSceneCostResultValueService iAppSceneCostResultValueService; + public static StandardCostService standardCostService; + + @PostConstruct + public void init() { + standardCostService = this; + standardCostService.costMaterialBomMapper = this.costMaterialBomMapper; + standardCostService.costPurchasePriceService = this.costPurchasePriceService; + standardCostService.iHourRateService = this.iHourRateService; + standardCostService.costMaterialProcessHoursService = this.costMaterialProcessHoursService; + standardCostService.iAppSceneCostResultValueService = this.iAppSceneCostResultValueService; + } + + + /** + * 1.物料编号输入任务 + */ + public static void materialInputTask(TaskExecutionContext parameters) { + try { + //获取任务流程相关信息 + FlowTaskInfoVO flowTaskInfoVO = analysisFlowTaskInfo(parameters); + //获取最上层的物料号 + String topMaterialCode = flowTaskInfoVO.getTopMaterialCode(); + //获取任务类型 + String taskType = parameters.getTaskType(); + //获取任务代码 + String taskCode = flowTaskInfoVO.getTaskCode(); + //获取流程id + String flowInstanceId = flowTaskInfoVO.getFlowInstanceId(); + //1.查询出所有满足物料编号的物料(BOM物料) + String sql = flowTaskInfoVO.getSqlString(); + List list = standardCostService.costMaterialBomMapper.customSelect(sql); + log.info("Full EmptyTask list: {}", list); + //2.把查询的结果存放在临时表里(表命名规则:前缀_流程id_组件code) + for (int i = 0; list != null && i < list.size(); i++) { + CostMaterialBom material = list.get(i); + AppSceneCostResultValue appSceneCostResultValue = AppSceneCostResultValue.builder().belongTopMaterialNo(topMaterialCode).marterialNo(material.getMaterialCode()).parentMarterialNo(material.getParentMaterialCode()).taskType(taskType).taskCode(taskCode).flowInstanceId(flowInstanceId).build(); + standardCostService.iAppSceneCostResultValueService.save(appSceneCostResultValue); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * 获取任务流程相关信息 + * + * @param parameters + * @return + */ + private static FlowTaskInfoVO analysisFlowTaskInfo(TaskExecutionContext parameters) { + FlowTaskInfoVO flowTaskInfoVO = new FlowTaskInfoVO(); + if (parameters != null) { + String s = parameters.toString(); + String[] split = s.split(","); + for (int i = 0; i < split.length; i++) { + String s1 = split[i]; + if (s1.contains("taskType")) { + String[] split1 = s1.split("="); + flowTaskInfoVO.setTaskType(split1[1]); + } else if (s1.contains("taskCode")) { + String[] split1 = s1.split(":"); + flowTaskInfoVO.setTaskCode(split1[1]); + } else if (s1.contains("flowInstanceId")) { + String[] split1 = s1.split("="); + flowTaskInfoVO.setFlowInstanceId(split1[1]); + } else if (s1.contains("sqlString")) { + String[] split1 = s1.split(":"); + flowTaskInfoVO.setSqlString(split1[1]); + } + } + } + //通过任务流程id查询流程定义信息(qomo_flow_definition) + flowTaskInfoVO = queryFlowDefinitionByFlowInstanceId(flowTaskInfoVO); + return flowTaskInfoVO; + } + + /** + * @param flowTaskInfoVO + */ + private static FlowTaskInfoVO queryFlowDefinitionByFlowInstanceId(FlowTaskInfoVO flowTaskInfoVO) { + String sql = "SELECT A.id,A.`code`,A.`name`,A.version,A.release_state,A.model_json from qomo_flow_definition as A LEFT JOIN qomo_flow_instance AS B ON A.`code`=B.flow_definition_code WHERE B.id=" + flowTaskInfoVO.getFlowInstanceId() + " limit 1"; + JSONObject jsonObject = standardCostService.costMaterialBomMapper.customSelectOne(sql); + FlowDefinition flowDefinition = JSON.toJavaObject(jsonObject, FlowDefinition.class); + if (flowDefinition != null) { + log.info("flowDefinition: {}", flowDefinition); + String modelJson = flowDefinition.getModelJson(); + JSONObject jsonObject1 = JSON.parseObject(modelJson); + if (jsonObject1 != null) { + String topMaterialCode = jsonObject1.getString("topMaterialCode"); + flowTaskInfoVO.setTopMaterialCode(topMaterialCode); + } + } + return flowTaskInfoVO; + } + + /** + * 2. 物料成本任务 + */ + public static void materialCostTask(TaskExecutionContext parameters) { + try { + //获取任务流程相关信息 + FlowTaskInfoVO flowTaskInfoVO = analysisFlowTaskInfo(parameters); + //获取最上层的物料号 + String topMaterialCode = flowTaskInfoVO.getTopMaterialCode(); + //获取任务类型 + String taskType = parameters.getTaskType(); + //获取任务代码 + String taskCode = flowTaskInfoVO.getTaskCode(); + //获取流程id + String flowInstanceId = flowTaskInfoVO.getFlowInstanceId(); + //1.查询出物料编号对应的下所有的BOM信息 + List list = standardCostService.iAppSceneCostResultValueService.getResultValueByTopMaterialNo(topMaterialCode, "MaterialInput", flowInstanceId); + //2.计算出所有的单个物料的物料成本 + //2.1查询出物料的单价和采购数量 + List MarterialNoList = new ArrayList<>(); + if (list != null && list.size() > 0) { + MarterialNoList = list.stream().filter(s -> s.getMarterialNo() != null).map(AppSceneCostResultValue::getMarterialNo).collect(Collectors.toList()); + } + //查询物料的采购价 + Map purchasePriceMap = standardCostService.costPurchasePriceService.getMinCostPurchasePriceByMaterialNo(MarterialNoList); + for (int i = 0; i < list.size(); i++) { + AppSceneCostResultValue appSceneCostResultValue = list.get(i); + String marterialNo = appSceneCostResultValue.getMarterialNo(); + Integer num = appSceneCostResultValue.getNum(); + if (marterialNo != null) { + BigDecimal price = purchasePriceMap.get(marterialNo); + BigDecimal number = new BigDecimal(num.toString()); + //单价乘以数量 + BigDecimal totalCost = price.multiply(number); + //2.2计算出人工成本并存储到成本结果数据表中 + AppSceneCostResultValue resultValue = AppSceneCostResultValue.builder().belongTopMaterialNo(topMaterialCode).marterialNo(marterialNo).parentMarterialNo(appSceneCostResultValue.getParentMarterialNo()).taskType(taskType).taskCode(taskCode).flowInstanceId(flowInstanceId).countValue(totalCost + "").build(); + standardCostService.iAppSceneCostResultValueService.save(resultValue); + } + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * 3.人工成本任务 + */ + public static void laborCostTask(TaskExecutionContext parameters) { + try { + //获取任务流程相关信息 + FlowTaskInfoVO flowTaskInfoVO = analysisFlowTaskInfo(parameters); + //获取最上层的物料号 + String topMaterialCode = flowTaskInfoVO.getTopMaterialCode(); + //获取任务类型 + String taskType = parameters.getTaskType(); + //获取任务代码 + String taskCode = flowTaskInfoVO.getTaskCode(); + //获取流程id + String flowInstanceId = flowTaskInfoVO.getFlowInstanceId(); + String sql = flowTaskInfoVO.getSqlString(); + JSONObject jsonObject = standardCostService.costMaterialBomMapper.customSelectOne(sql); + BigDecimal hourRate = new BigDecimal("0"); + if (jsonObject != null) { + HourRate rate = JSON.toJavaObject(jsonObject, HourRate.class); + hourRate = rate.getLaborHourRate(); + } + //1.查询出物料编号对应的下所有的BOM信息 + List list = standardCostService.iAppSceneCostResultValueService.getResultValueByTopMaterialNo(topMaterialCode, "MaterialInput", flowInstanceId); + //2.计算出所有的单个物料的人工成本 + //2.1查询出物料的人员工时和人工小时费率(涉及:小时费率表和工序表) + List MarterialNoList = new ArrayList<>(); + if (list != null && list.size() > 0) { + MarterialNoList = list.stream().filter(s -> s.getMarterialNo() != null).map(AppSceneCostResultValue::getMarterialNo).collect(Collectors.toList()); + } + //查询工序工时 + Map> processHoursMap = standardCostService.costMaterialProcessHoursService.getProcessHoursByMaterialNo(MarterialNoList); + for (int i = 0; i < list.size(); i++) { + AppSceneCostResultValue appSceneCostResultValue = list.get(i); + String marterialNo = appSceneCostResultValue.getMarterialNo(); + if (marterialNo != null) { + BigDecimal totalCost = new BigDecimal("0.0"); + List costMaterialProcessHours = processHoursMap.get(marterialNo); + if (costMaterialProcessHours != null && costMaterialProcessHours.size() > 0) { + for (int j = 0; j < costMaterialProcessHours.size(); j++) { + CostMaterialProcessHours processHours = costMaterialProcessHours.get(j); + BigDecimal laborHours = processHours.getLaborHours(); + //计算总人工成本 + totalCost = totalCost.add(laborHours.multiply(hourRate)); + } + } + //2.2计算出人工成本并存储到成本结果数据表中 + AppSceneCostResultValue resultValue = AppSceneCostResultValue.builder().belongTopMaterialNo(topMaterialCode).marterialNo(marterialNo).parentMarterialNo(appSceneCostResultValue.getParentMarterialNo()).taskType(taskType).taskCode(taskCode).flowInstanceId(flowInstanceId).countValue(totalCost + "").build(); + standardCostService.iAppSceneCostResultValueService.save(resultValue); + } + } + } catch (Exception e) { + throw new RuntimeException(e); + } + + } + + /** + * 4.制造费用成本任务 + */ + public static void manufacturingCostTask(TaskExecutionContext parameters) { + try { + //获取任务流程相关信息 + FlowTaskInfoVO flowTaskInfoVO = analysisFlowTaskInfo(parameters); + //获取最上层的物料号 + String topMaterialCode = flowTaskInfoVO.getTopMaterialCode(); + //获取任务类型 + String taskType = parameters.getTaskType(); + //获取任务代码 + String taskCode = flowTaskInfoVO.getTaskCode(); + //获取流程id + String flowInstanceId = flowTaskInfoVO.getFlowInstanceId(); + /** + * 费用类别 + */ + String feeType = flowTaskInfoVO.getFeeType(); + /** + * 小时费率 + */ + String sql = flowTaskInfoVO.getSqlString(); + JSONObject jsonObject = standardCostService.costMaterialBomMapper.customSelectOne(sql); + BigDecimal hourRate = new BigDecimal("0"); + if (jsonObject != null) { + HourRate rate = JSON.toJavaObject(jsonObject, HourRate.class); + hourRate = rate.getLaborHourRate(); + } + //1.查询出物料编号对应的下所有的BOM信息 + List list = standardCostService.iAppSceneCostResultValueService.getResultValueByTopMaterialNo(topMaterialCode, "MaterialInput", flowInstanceId); + //2.根据费用类型进行不同的费用计算 + //查询工序工时 + List MarterialNoList = new ArrayList<>(); + if (list != null && list.size() > 0) { + MarterialNoList = list.stream().filter(s -> s.getMarterialNo() != null).map(AppSceneCostResultValue::getMarterialNo).collect(Collectors.toList()); + } + Map> processHoursMap = standardCostService.costMaterialProcessHoursService.getProcessHoursByMaterialNo(MarterialNoList); + //2.1机器折旧费(机器工时*费率) + if (FeeTypeEnum.EquipmentFee.getCode().equals(feeType)) { + for (int i = 0; i < list.size(); i++) { + AppSceneCostResultValue appSceneCostResultValue = list.get(i); + String marterialNo = appSceneCostResultValue.getMarterialNo(); + if (marterialNo != null) { + BigDecimal totalCost = new BigDecimal("0.0"); + List costMaterialProcessHours = processHoursMap.get(marterialNo); + if (costMaterialProcessHours != null && costMaterialProcessHours.size() > 0) { + for (int j = 0; j < costMaterialProcessHours.size(); j++) { + CostMaterialProcessHours processHours = costMaterialProcessHours.get(j); + BigDecimal laborHours = processHours.getDeviceHours(); + //计算机器成本 + totalCost = totalCost.add(laborHours.multiply(hourRate)); + } + } + //2.2计算机器成本并存储到成本结果数据表中 + AppSceneCostResultValue resultValue = AppSceneCostResultValue.builder().belongTopMaterialNo(topMaterialCode).marterialNo(marterialNo).parentMarterialNo(appSceneCostResultValue.getParentMarterialNo()).taskType(taskType).taskCode(taskCode).flowInstanceId(flowInstanceId).countValue(totalCost + "").build(); + standardCostService.iAppSceneCostResultValueService.save(resultValue); + } + } + } else if (FeeTypeEnum.SupplyMaterialFee.getCode().equals(feeType)) { + //机物料消耗(辅料工时*费率) + for (int i = 0; i < list.size(); i++) { + AppSceneCostResultValue appSceneCostResultValue = list.get(i); + String marterialNo = appSceneCostResultValue.getMarterialNo(); + if (marterialNo != null) { + BigDecimal totalCost = new BigDecimal("0.0"); + List costMaterialProcessHours = processHoursMap.get(marterialNo); + if (costMaterialProcessHours != null && costMaterialProcessHours.size() > 0) { + for (int j = 0; j < costMaterialProcessHours.size(); j++) { + CostMaterialProcessHours processHours = costMaterialProcessHours.get(j); + //TODO 辅料工时来源 + BigDecimal laborHours = processHours.getLaborHours(); + //机物料消耗 + totalCost = totalCost.add(laborHours.multiply(hourRate)); + } + } + //2.2计算机物料消耗存储到成本结果数据表中 + AppSceneCostResultValue resultValue = AppSceneCostResultValue.builder().belongTopMaterialNo(topMaterialCode).marterialNo(marterialNo).parentMarterialNo(appSceneCostResultValue.getParentMarterialNo()).taskType(taskType).taskCode(taskCode).flowInstanceId(flowInstanceId).countValue(totalCost + "").build(); + standardCostService.iAppSceneCostResultValueService.save(resultValue); + } + } + } else if (FeeTypeEnum.DriverFee.getCode().equals(feeType)) { + //2.3水电费(燃动力工时*费率) + for (int i = 0; i < list.size(); i++) { + AppSceneCostResultValue appSceneCostResultValue = list.get(i); + String marterialNo = appSceneCostResultValue.getMarterialNo(); + if (marterialNo != null) { + BigDecimal totalCost = new BigDecimal("0.0"); + List costMaterialProcessHours = processHoursMap.get(marterialNo); + if (costMaterialProcessHours != null && costMaterialProcessHours.size() > 0) { + for (int j = 0; j < costMaterialProcessHours.size(); j++) { + CostMaterialProcessHours processHours = costMaterialProcessHours.get(j); + //TODO 燃动力工时来源 + BigDecimal laborHours = processHours.getLaborHours(); + //机物料消耗 + totalCost = totalCost.add(laborHours.multiply(hourRate)); + } + } + //2.2计算机物料消耗存储到成本结果数据表中 + AppSceneCostResultValue resultValue = AppSceneCostResultValue.builder().belongTopMaterialNo(topMaterialCode).marterialNo(marterialNo).parentMarterialNo(appSceneCostResultValue.getParentMarterialNo()).taskType(taskType).taskCode(taskCode).flowInstanceId(flowInstanceId).countValue(totalCost + "").build(); + standardCostService.iAppSceneCostResultValueService.save(resultValue); + } + } + } else if (FeeTypeEnum.OtherFee.getCode().equals(feeType)) { + //2.4其他制费(其他工时*费率) + for (int i = 0; i < list.size(); i++) { + AppSceneCostResultValue appSceneCostResultValue = list.get(i); + String marterialNo = appSceneCostResultValue.getMarterialNo(); + if (marterialNo != null) { + BigDecimal totalCost = new BigDecimal("0.0"); + List costMaterialProcessHours = processHoursMap.get(marterialNo); + if (costMaterialProcessHours != null && costMaterialProcessHours.size() > 0) { + for (int j = 0; j < costMaterialProcessHours.size(); j++) { + CostMaterialProcessHours processHours = costMaterialProcessHours.get(j); + //TODO 其他工时来源 + BigDecimal laborHours = processHours.getLaborHours(); + //机物料消耗 + totalCost = totalCost.add(laborHours.multiply(hourRate)); + } + } + //2.2计算机物料消耗存储到成本结果数据表中 + AppSceneCostResultValue resultValue = AppSceneCostResultValue.builder().belongTopMaterialNo(topMaterialCode).marterialNo(marterialNo).parentMarterialNo(appSceneCostResultValue.getParentMarterialNo()).taskType(taskType).taskCode(taskCode).flowInstanceId(flowInstanceId).countValue(totalCost + "").build(); + standardCostService.iAppSceneCostResultValueService.save(resultValue); + } + } + } else if (FeeTypeEnum.LogisticsFee.getCode().equals(feeType)) { + //查出所有的机器折旧费、机物料消耗、水电费、其他制费 + list = standardCostService.iAppSceneCostResultValueService.getResultValueByTopMaterialNo(topMaterialCode, "ManufacturingCost", flowInstanceId); + //2.5物流费((机器折旧+机物料消耗+水电费+其他制费)*10.16%) + //按照物料编号进行分组 + Map> materialNoMap = list.stream().collect(Collectors.groupingBy(AppSceneCostResultValue::getMarterialNo)); + for (String key : materialNoMap.keySet()) { + List appSceneCostResultValues = materialNoMap.get(key); + BigDecimal totalCost = new BigDecimal("0.0"); + for (int j = 0; j < appSceneCostResultValues.size(); j++) { + AppSceneCostResultValue appSceneCostResultValue = appSceneCostResultValues.get(j); + String countValue = appSceneCostResultValue.getCountValue(); + if (countValue != null) { + totalCost = totalCost.add(new BigDecimal(countValue)); + } + } + AppSceneCostResultValue resultValue = AppSceneCostResultValue.builder().belongTopMaterialNo(topMaterialCode).marterialNo(key).parentMarterialNo(appSceneCostResultValues.get(0).getParentMarterialNo()).taskType(taskType).taskCode(taskCode).flowInstanceId(flowInstanceId).countValue(totalCost.multiply(new BigDecimal("0.1016")).toString()).build(); + standardCostService.iAppSceneCostResultValueService.save(resultValue); + } + } + } catch (Exception e) { + throw new RuntimeException(e); + } + + } + + /** + * 5.标准成本计算任务 + */ + public static void standardCostTask(TaskExecutionContext parameters) { + //获取任务流程相关信息 + FlowTaskInfoVO flowTaskInfoVO = analysisFlowTaskInfo(parameters); + //获取最上层的物料号 + String topMaterialCode = flowTaskInfoVO.getTopMaterialCode(); + //获取任务类型 + String taskType = parameters.getTaskType(); + //获取任务代码 + String taskCode = flowTaskInfoVO.getTaskCode(); + //获取流程id + String flowInstanceId = flowTaskInfoVO.getFlowInstanceId(); + //1.查询出物料编号对应的下所有的BOM信息 + List list = standardCostService.iAppSceneCostResultValueService.getResultValueByTopMaterialNo(topMaterialCode, null, flowInstanceId); + //2.计算出所有的单个物料的本阶的标准成本(标准成本=物料成本+人工成本+制造费用) + //按照物料编号进行分组 + Map> materialNoMap = list.stream().collect(Collectors.groupingBy(AppSceneCostResultValue::getMarterialNo)); + for (String key : materialNoMap.keySet()) { + List appSceneCostResultValues = materialNoMap.get(key); + //本阶成本 + BigDecimal currentCost = new BigDecimal("0.0"); + for (int j = 0; j < appSceneCostResultValues.size(); j++) { + AppSceneCostResultValue appSceneCostResultValue = appSceneCostResultValues.get(j); + String countValue = appSceneCostResultValue.getCountValue(); + if (countValue != null) { + currentCost = currentCost.add(new BigDecimal(countValue)); + } + } + AppSceneCostResultValue resultValue = AppSceneCostResultValue.builder().belongTopMaterialNo(topMaterialCode).marterialNo(key).parentMarterialNo(appSceneCostResultValues.get(0).getParentMarterialNo()).taskType(taskType).taskCode(taskCode).flowInstanceId(flowInstanceId).countValue(currentCost.toString()).build(); + standardCostService.iAppSceneCostResultValueService.save(resultValue); + } + //3.计算出所有的单个物料的累计标准成本 + List standardCostList = standardCostService.iAppSceneCostResultValueService.getResultValueByTopMaterialNo(topMaterialCode, taskType, flowInstanceId); + //循环算出各个物料的累计成本 + totalCountCost(standardCostList, topMaterialCode, taskType, taskCode, flowInstanceId); + } + + /** + * 循环算出各个物料的累计成本 + * + * @param standardCostList + * @param topMaterialCode + * @param taskType + * @param taskCode + * @param flowInstanceId + */ + private static void totalCountCost(List standardCostList, String topMaterialCode, String taskType, String taskCode, String flowInstanceId) { + Map> parentMaterialNoMap = standardCostList.stream().filter(appSceneCostResultValue -> appSceneCostResultValue.getParentMarterialNo() != null).collect(Collectors.groupingBy(AppSceneCostResultValue::getParentMarterialNo)); + for (int i = 0; i < standardCostList.size(); i++) { + AppSceneCostResultValue appSceneCostResultValue = standardCostList.get(i); + BigDecimal totalCost = new BigDecimal("0.0"); + totalCost = loopCount(appSceneCostResultValue, parentMaterialNoMap, topMaterialCode, taskType, taskCode, flowInstanceId, totalCost); + appSceneCostResultValue.setTotalValue(totalCost.toString()); + standardCostService.iAppSceneCostResultValueService.save(appSceneCostResultValue); + } + } + + /** + * 递归计算出累计成本 + * + * @param appSceneCostResultValue + * @param parentMaterialNoMap + * @param topMaterialCode + * @param taskType + * @param taskCode + * @param flowInstanceId + */ + private static BigDecimal loopCount(AppSceneCostResultValue appSceneCostResultValue, Map> parentMaterialNoMap, String topMaterialCode, String taskType, String taskCode, String flowInstanceId, BigDecimal totalCost) { + String marterialNo = appSceneCostResultValue.getMarterialNo(); + if (parentMaterialNoMap.containsKey(marterialNo)) { + List appSceneCostResultValues = parentMaterialNoMap.get(marterialNo); + for (int j = 0; j < appSceneCostResultValues.size(); j++) { + AppSceneCostResultValue appSceneCostResultValue1 = appSceneCostResultValues.get(j); + String countValue = appSceneCostResultValue1.getCountValue(); + if (countValue != null) { + totalCost = totalCost.add(new BigDecimal(countValue)); + } + loopCount(appSceneCostResultValue1, parentMaterialNoMap, topMaterialCode, taskType, taskCode, flowInstanceId, totalCost); + } + } + return totalCost; + } +} diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/laborcost/LaborCostTask.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/laborcost/LaborCostTask.java index 2c55376..ecf054f 100644 --- a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/laborcost/LaborCostTask.java +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/laborcost/LaborCostTask.java @@ -17,7 +17,7 @@ package com.zzsmart.qomo.kn.cost.manage.plugin.laborcost; -import com.zzsmart.qomo.kn.cost.manage.plugin.materialinput.StandardCostService; +import com.zzsmart.qomo.kn.cost.manage.plugin.StandardCostService; import com.zzsmart.qomo.plugin.task.api.*; import com.zzsmart.qomo.plugin.task.api.parameters.AbstractParameters; diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/manufacturingcost/ManufacturingCostTask.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/manufacturingcost/ManufacturingCostTask.java index 727b0c9..6b41f15 100644 --- a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/manufacturingcost/ManufacturingCostTask.java +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/manufacturingcost/ManufacturingCostTask.java @@ -17,17 +17,9 @@ package com.zzsmart.qomo.kn.cost.manage.plugin.manufacturingcost; -import com.zzsmart.qomo.kn.cost.manage.entity.AppSceneCostResultValue; -import com.zzsmart.qomo.kn.cost.manage.entity.CostMaterialBom; -import com.zzsmart.qomo.kn.cost.manage.mapper.CostMaterialBomMapper; -import com.zzsmart.qomo.kn.cost.manage.plugin.materialinput.StandardCostService; -import com.zzsmart.qomo.kn.cost.manage.service.IAppSceneCostResultValueService; +import com.zzsmart.qomo.kn.cost.manage.plugin.StandardCostService; import com.zzsmart.qomo.plugin.task.api.*; import com.zzsmart.qomo.plugin.task.api.parameters.AbstractParameters; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.Date; -import java.util.List; /** * 制造费用成本任务 diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/materialcost/MaterialCostTask.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/materialcost/MaterialCostTask.java index 4452ba6..e1728f1 100644 --- a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/materialcost/MaterialCostTask.java +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/materialcost/MaterialCostTask.java @@ -17,17 +17,9 @@ package com.zzsmart.qomo.kn.cost.manage.plugin.materialcost; -import com.zzsmart.qomo.kn.cost.manage.entity.AppSceneCostResultValue; -import com.zzsmart.qomo.kn.cost.manage.entity.CostMaterialBom; -import com.zzsmart.qomo.kn.cost.manage.mapper.CostMaterialBomMapper; -import com.zzsmart.qomo.kn.cost.manage.plugin.materialinput.StandardCostService; -import com.zzsmart.qomo.kn.cost.manage.service.IAppSceneCostResultValueService; +import com.zzsmart.qomo.kn.cost.manage.plugin.StandardCostService; import com.zzsmart.qomo.plugin.task.api.*; import com.zzsmart.qomo.plugin.task.api.parameters.AbstractParameters; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.Date; -import java.util.List; /** * 物料成本计算任务 @@ -62,9 +54,9 @@ public class MaterialCostTask extends AbstractTask { @Override public void handle(TaskCallBack taskCallBack) throws TaskException { - log.info("Full EmptyTask parameters: {}", taskRequest); + log.info("Full EmptyTask parameters: {}", taskExecutionContext); try { - StandardCostService.materialCostTask(taskRequest); + StandardCostService.materialCostTask(taskExecutionContext); } catch (Exception e) { //运行失败退出 setExitStatusCode(TaskConstants.EXIT_CODE_FAILURE); diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/materialinput/MaterialInputTask.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/materialinput/MaterialInputTask.java index 8e38a6e..5dda9dd 100644 --- a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/materialinput/MaterialInputTask.java +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/materialinput/MaterialInputTask.java @@ -17,6 +17,7 @@ package com.zzsmart.qomo.kn.cost.manage.plugin.materialinput; +import com.zzsmart.qomo.kn.cost.manage.plugin.StandardCostService; import com.zzsmart.qomo.plugin.task.api.*; import com.zzsmart.qomo.plugin.task.api.parameters.AbstractParameters; diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/materialinput/StandardCostService.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/materialinput/StandardCostService.java deleted file mode 100644 index a545ba5..0000000 --- a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/materialinput/StandardCostService.java +++ /dev/null @@ -1,169 +0,0 @@ -package com.zzsmart.qomo.kn.cost.manage.plugin.materialinput; - -import com.zzsmart.qomo.kn.cost.manage.entity.AppSceneCostResultValue; -import com.zzsmart.qomo.kn.cost.manage.entity.CostMaterialBom; -import com.zzsmart.qomo.kn.cost.manage.entity.CostMaterialProcessHours; -import com.zzsmart.qomo.kn.cost.manage.mapper.CostMaterialBomMapper; -import com.zzsmart.qomo.kn.cost.manage.service.CostMaterialProcessHoursService; -import com.zzsmart.qomo.kn.cost.manage.service.IAppSceneCostResultValueService; -import com.zzsmart.qomo.kn.cost.manage.service.IHourRateService; -import com.zzsmart.qomo.plugin.task.api.TaskExecutionContext; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.annotation.PostConstruct; -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -@Service -@Slf4j -public class StandardCostService { - /** - * 物料BOM信息 - */ - @Autowired - CostMaterialBomMapper costMaterialBomMapper; - - /** - * 小时费率 - */ - @Autowired - IHourRateService iHourRateService; - /** - * 工序 - */ - @Autowired - CostMaterialProcessHoursService costMaterialProcessHoursService; - /** - * 标准成本计算结果 - */ - @Autowired - IAppSceneCostResultValueService iAppSceneCostResultValueService; - public static StandardCostService standardCostService; - - @PostConstruct - public void init() { - standardCostService = this; - standardCostService.costMaterialBomMapper = this.costMaterialBomMapper; - standardCostService.iHourRateService = this.iHourRateService; - standardCostService.costMaterialProcessHoursService = this.costMaterialProcessHoursService; - standardCostService.iAppSceneCostResultValueService = this.iAppSceneCostResultValueService; - } - - - /** - * 物料编号输入任务 - */ - public static void materialInputTask(TaskExecutionContext parameters) { - try { - //获取最上层的物料号 - String materialCode = ""; - //获取任务类型 - String taskType = ""; - //获取任务代码 - String taskCode = ""; - //获取流程id - String flowInstanceId = "1"; - //1.查询出所有满足物料编号的物料(BOM物料) - String sql = "select * from app_scene_cost_material_bom "; - List list = standardCostService.costMaterialBomMapper.customSelect(sql); - log.info("Full EmptyTask list: {}", list); - //2.把查询的结果存放在临时表里(表命名规则:前缀_流程id_组件code) - for (int i = 0; list != null && i < list.size(); i++) { - CostMaterialBom material = list.get(i); - AppSceneCostResultValue appSceneCostResultValue = AppSceneCostResultValue.builder().belongTopMaterialNo(materialCode).marterialNo(material.getMaterialCode()).parentMarterialNo(material.getParentMaterialCode()).taskType(taskType).taskCode(taskCode).flowInstanceId(flowInstanceId).build(); - standardCostService.iAppSceneCostResultValueService.save(appSceneCostResultValue); - } - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - /** - * 物料成本任务 - */ - public static void materialCostTask(TaskExecutionContext parameters) { - //1.查询出物料编号对应的下所有的BOM信息 - //2.计算出所有的单个物料的物料成本 - //2.1查询出物料的单价和采购数量 - //2.2计算出物料成本并存储到成本结果数据表中 - } - - /** - * 人工成本任务 - */ - public static void laborCostTask(TaskExecutionContext parameters) { - try { - //获取最上层的物料号 - String topMaterialCode = ""; - //获取任务类型 - String taskType = ""; - //获取上一节点任务类型 - String lastTaskType = "LaborCost"; - //获取任务代码 - String taskCode = ""; - //获取流程id - String flowInstanceId = "1"; - //人工费率 - BigDecimal laborRate = new BigDecimal("0.0"); - //1.查询出物料编号对应的下所有的BOM信息 - List list = standardCostService.iAppSceneCostResultValueService.getResultValueByTopMaterialNo(topMaterialCode, lastTaskType, flowInstanceId); - //2.计算出所有的单个物料的人工成本 - //2.1查询出物料的人员工时和人工小时费率(涉及:小时费率表和工序表) - List MarterialNoList = new ArrayList<>(); - if (list != null && list.size() > 0) { - MarterialNoList = list.stream().filter(s -> s.getMarterialNo() != null).map(AppSceneCostResultValue::getMarterialNo).collect(Collectors.toList()); - } - //查询工序工时 - Map> processHoursMap = standardCostService.costMaterialProcessHoursService.getProcessHoursByMaterialNo(MarterialNoList); - for (int i = 0; i < list.size(); i++) { - AppSceneCostResultValue appSceneCostResultValue = list.get(i); - String marterialNo = appSceneCostResultValue.getMarterialNo(); - if (marterialNo != null) { - BigDecimal totalLaborCost = new BigDecimal("0.0"); - List costMaterialProcessHours = processHoursMap.get(marterialNo); - if (costMaterialProcessHours != null && costMaterialProcessHours.size() > 0) { - for (int j = 0; j < costMaterialProcessHours.size(); j++) { - CostMaterialProcessHours processHours = costMaterialProcessHours.get(j); - BigDecimal laborHours = processHours.getLaborHours(); - //计算总人工成本 - totalLaborCost.add(laborHours.multiply(laborRate)); - } - } - //2.2计算出人工成本并存储到成本结果数据表中 - AppSceneCostResultValue resultValue = AppSceneCostResultValue.builder().belongTopMaterialNo(topMaterialCode).marterialNo(marterialNo).parentMarterialNo(appSceneCostResultValue.getParentMarterialNo()).taskType(taskType).taskCode(taskCode).flowInstanceId(flowInstanceId).countValue(totalLaborCost + "").build(); - standardCostService.iAppSceneCostResultValueService.save(resultValue); - } - } - } catch (Exception e) { - throw new RuntimeException(e); - } - - } - - /** - * 制造费用成本任务 - */ - public static void manufacturingCostTask(TaskExecutionContext parameters) { - //1.查询出物料编号对应的下所有的BOM信息 - //2.根据费用类型进行不同的费用计算 - //2.1机器折旧费(机器工时*费率) - //2.2机物料消耗费(辅料工时*费率) - //2.3水电费(燃动力工时*费率) - //2.4其他制费(其他工时*费率) - //2.5物流费((机器折旧+机物料消耗+水电费+其他制费)*10.16%) - } - - /** - * 标准成本计算任务 - */ - public static void standardCostTask(TaskExecutionContext parameters) { - //1.查询出物料编号对应的下所有的BOM信息 - //2.计算出所有的单个物料的本阶的标准成本(标准成本=物料成本+人工成本+制造费用) - //3.计算出所有的单个物料的累计标准成本 - } -} diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/standardcost/StandardCostTask.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/standardcost/StandardCostTask.java index abacd55..366f4b7 100644 --- a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/standardcost/StandardCostTask.java +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/standardcost/StandardCostTask.java @@ -17,12 +17,9 @@ package com.zzsmart.qomo.kn.cost.manage.plugin.standardcost; -import com.zzsmart.qomo.kn.cost.manage.mapper.CostMaterialBomMapper; -import com.zzsmart.qomo.kn.cost.manage.plugin.materialinput.StandardCostService; -import com.zzsmart.qomo.kn.cost.manage.service.IAppSceneCostResultValueService; +import com.zzsmart.qomo.kn.cost.manage.plugin.StandardCostService; import com.zzsmart.qomo.plugin.task.api.*; import com.zzsmart.qomo.plugin.task.api.parameters.AbstractParameters; -import org.springframework.beans.factory.annotation.Autowired; /** * 标准成本计算任务 diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/CostPurchasePriceService.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/CostPurchasePriceService.java index cac2eb2..4a7d836 100644 --- a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/CostPurchasePriceService.java +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/CostPurchasePriceService.java @@ -1,8 +1,13 @@ package com.zzsmart.qomo.kn.cost.manage.service; +import com.zzsmart.qomo.kn.cost.manage.entity.CostMaterialProcessHours; import com.zzsmart.qomo.kn.cost.manage.entity.CostPurchasePrice; import com.baomidou.mybatisplus.extension.service.IService; +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + /** *

* 物料采购单价 服务类 @@ -12,5 +17,8 @@ import com.baomidou.mybatisplus.extension.service.IService; * @since 2024-06-19 */ public interface CostPurchasePriceService extends IService { - + /** + * 查询满足物料编号的最低采购价 + */ + Map getMinCostPurchasePriceByMaterialNo(List materialNos); } diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/IAppSceneCostResultValueService.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/IAppSceneCostResultValueService.java index 5e42df0..b2474e3 100644 --- a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/IAppSceneCostResultValueService.java +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/IAppSceneCostResultValueService.java @@ -17,5 +17,5 @@ public interface IAppSceneCostResultValueService extends IService getResultValueByTopMaterialNo(String topMaterialCode,String lastTaskType,String flowInstanceId); + List getResultValueByTopMaterialNo(String topMaterialCode,String taskType,String flowInstanceId); } diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/impl/AppSceneCostResultValueServiceImpl.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/impl/AppSceneCostResultValueServiceImpl.java index fe6e7a7..4b5169f 100644 --- a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/impl/AppSceneCostResultValueServiceImpl.java +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/impl/AppSceneCostResultValueServiceImpl.java @@ -39,6 +39,9 @@ public class AppSceneCostResultValueServiceImpl extends ServiceImpl * 物料采购单价 服务实现类 *

* - * @author + * @author * @since 2024-06-19 */ @Service public class CostPurchasePriceServiceImpl extends ServiceImpl implements CostPurchasePriceService { + @Autowired + CostPurchasePriceMapper costPurchasePriceMapper; + /** + * 查询满足物料编号的最低采购价 + * + * @param materialNos + */ + @Override + public Map getMinCostPurchasePriceByMaterialNo(List materialNos) { + Map map = new HashMap<>(); + QueryWrapper queryWrapper = new QueryWrapper(); + if (materialNos != null && materialNos.size() > 0) { + queryWrapper.in("material_code", materialNos); + List costPurchasePrices = costPurchasePriceMapper.selectList(queryWrapper); + for (int i = 0; i < costPurchasePrices.size(); i++) { + CostPurchasePrice costPurchasePrice = costPurchasePrices.get(i); + map.put(costPurchasePrice.getMaterialCode(), costPurchasePrice.getMinPurchasePrice()); + } + } + return map; + } } diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/vo/FlowTaskInfoVO.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/vo/FlowTaskInfoVO.java new file mode 100644 index 0000000..7da21a4 --- /dev/null +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/vo/FlowTaskInfoVO.java @@ -0,0 +1,37 @@ +package com.zzsmart.qomo.kn.cost.manage.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FlowTaskInfoVO { + /** + * 最顶层物料编号 + */ + private String topMaterialCode; + /** + * 获取任务类型 + */ + private String taskType; + /** + * 获取任务代码 + */ + private String taskCode; + /** + * 获取流程id + */ + private String flowInstanceId; + /** + * SQL查询语句 + */ + private String sqlString; + /** + * 费用类别 + */ + private String feeType; +}