瀏覽代碼

完善标准成本计算功能

wangqiong 1 年之前
父節點
當前提交
1030034e41
共有 16 個檔案被更改,包括 726 行新增246 行删除
  1. 74
    33
      qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/entity/AppSceneCostResultValue.java
  2. 58
    0
      qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/enums/FeeTypeEnum.java
  3. 11
    16
      qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/enums/StandardStageEnum.java
  4. 5
    0
      qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/mapper/CostMaterialBomMapper.java
  5. 489
    0
      qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/StandardCostService.java
  6. 1
    1
      qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/laborcost/LaborCostTask.java
  7. 1
    9
      qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/manufacturingcost/ManufacturingCostTask.java
  8. 3
    11
      qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/materialcost/MaterialCostTask.java
  9. 1
    0
      qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/materialinput/MaterialInputTask.java
  10. 0
    169
      qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/materialinput/StandardCostService.java
  11. 1
    4
      qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/standardcost/StandardCostTask.java
  12. 9
    1
      qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/CostPurchasePriceService.java
  13. 1
    1
      qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/IAppSceneCostResultValueService.java
  14. 3
    0
      qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/impl/AppSceneCostResultValueServiceImpl.java
  15. 32
    1
      qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/impl/CostPurchasePriceServiceImpl.java
  16. 37
    0
      qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/vo/FlowTaskInfoVO.java

+ 74
- 33
qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/entity/AppSceneCostResultValue.java 查看文件

1
 package com.zzsmart.qomo.kn.cost.manage.entity;
1
 package com.zzsmart.qomo.kn.cost.manage.entity;
2
 
2
 
3
-import java.io.Serializable;
4
-import java.io.UnsupportedEncodingException;
5
-import java.util.Date;
6
-import java.math.BigDecimal;
7
 import com.baomidou.mybatisplus.annotation.IdType;
3
 import com.baomidou.mybatisplus.annotation.IdType;
8
 import com.baomidou.mybatisplus.annotation.TableId;
4
 import com.baomidou.mybatisplus.annotation.TableId;
9
 import com.baomidou.mybatisplus.annotation.TableName;
5
 import com.baomidou.mybatisplus.annotation.TableName;
10
-import com.baomidou.mybatisplus.annotation.TableLogic;
11
-import lombok.Builder;
12
-import lombok.Data;
13
 import com.fasterxml.jackson.annotation.JsonFormat;
6
 import com.fasterxml.jackson.annotation.JsonFormat;
14
-import org.springframework.format.annotation.DateTimeFormat;
15
-import org.jeecgframework.poi.excel.annotation.Excel;
16
-import org.jeecg.common.aspect.annotation.Dict;
17
 import io.swagger.annotations.ApiModel;
7
 import io.swagger.annotations.ApiModel;
18
 import io.swagger.annotations.ApiModelProperty;
8
 import io.swagger.annotations.ApiModelProperty;
9
+import lombok.Builder;
10
+import lombok.Data;
19
 import lombok.EqualsAndHashCode;
11
 import lombok.EqualsAndHashCode;
20
 import lombok.experimental.Accessors;
12
 import lombok.experimental.Accessors;
13
+import org.jeecgframework.poi.excel.annotation.Excel;
14
+import org.springframework.format.annotation.DateTimeFormat;
15
+
16
+import java.io.Serializable;
17
+import java.util.Date;
21
 
18
 
22
 /**
19
 /**
23
  * @Description: app_scene_cost_result_value
20
  * @Description: app_scene_cost_result_value
24
  * @Author: jeecg-boot
21
  * @Author: jeecg-boot
25
- * @Date:   2024-07-23
22
+ * @Date: 2024-07-25
26
  * @Version: V1.0
23
  * @Version: V1.0
27
  */
24
  */
28
 @Data
25
 @Data
30
 @TableName("app_scene_cost_result_value")
27
 @TableName("app_scene_cost_result_value")
31
 @Accessors(chain = true)
28
 @Accessors(chain = true)
32
 @EqualsAndHashCode(callSuper = false)
29
 @EqualsAndHashCode(callSuper = false)
33
-@ApiModel(value="app_scene_cost_result_value对象", description="app_scene_cost_result_value")
30
+@ApiModel(value = "app_scene_cost_result_value对象", description = "app_scene_cost_result_value")
34
 public class AppSceneCostResultValue implements Serializable {
31
 public class AppSceneCostResultValue implements Serializable {
35
     private static final long serialVersionUID = 1L;
32
     private static final long serialVersionUID = 1L;
36
 
33
 
37
-	/**主键*/
38
-	@TableId(type = IdType.ASSIGN_ID)
34
+    /**
35
+     * 主键
36
+     */
37
+    @TableId(type = IdType.ASSIGN_ID)
39
     @ApiModelProperty(value = "主键")
38
     @ApiModelProperty(value = "主键")
40
     private Integer id;
39
     private Integer id;
41
-	/**所属最上级物料号*/
42
-	@Excel(name = "所属最上级物料号", width = 15)
40
+    /**
41
+     * 所属最上级物料号
42
+     */
43
+    @Excel(name = "所属最上级物料号", width = 15)
43
     @ApiModelProperty(value = "所属最上级物料号")
44
     @ApiModelProperty(value = "所属最上级物料号")
44
     private String belongTopMaterialNo;
45
     private String belongTopMaterialNo;
45
-	/**物料编号*/
46
-	@Excel(name = "物料编号", width = 15)
46
+    /**
47
+     * 物料编号
48
+     */
49
+    @Excel(name = "物料编号", width = 15)
47
     @ApiModelProperty(value = "物料编号")
50
     @ApiModelProperty(value = "物料编号")
48
     private String marterialNo;
51
     private String marterialNo;
49
-	/**父类物料编号*/
50
-	@Excel(name = "父类物料编号", width = 15)
52
+    /**
53
+     * 父类物料编号
54
+     */
55
+    @Excel(name = "父类物料编号", width = 15)
51
     @ApiModelProperty(value = "父类物料编号")
56
     @ApiModelProperty(value = "父类物料编号")
52
     private String parentMarterialNo;
57
     private String parentMarterialNo;
53
-	/**任务类型*/
54
-	@Excel(name = "任务类型", width = 15)
58
+    /**
59
+     * 数量
60
+     */
61
+    @Excel(name = "数量", width = 15)
62
+    @ApiModelProperty(value = "数量")
63
+    private Integer num;
64
+    /**
65
+     * 单位
66
+     */
67
+    @Excel(name = "单位", width = 15)
68
+    @ApiModelProperty(value = "单位")
69
+    private String unit;
70
+    /**
71
+     * 任务类型
72
+     */
73
+    @Excel(name = "任务类型", width = 15)
55
     @ApiModelProperty(value = "任务类型")
74
     @ApiModelProperty(value = "任务类型")
56
     private String taskType;
75
     private String taskType;
57
-	/**任务代码*/
58
-	@Excel(name = "任务代码", width = 15)
76
+    /**
77
+     * 任务代码
78
+     */
79
+    @Excel(name = "任务代码", width = 15)
59
     @ApiModelProperty(value = "任务代码")
80
     @ApiModelProperty(value = "任务代码")
60
     private String taskCode;
81
     private String taskCode;
61
-	/**流程id*/
62
-	@Excel(name = "流程id", width = 15)
82
+    /**
83
+     * 流程id
84
+     */
85
+    @Excel(name = "流程id", width = 15)
63
     @ApiModelProperty(value = "流程id")
86
     @ApiModelProperty(value = "流程id")
64
     private String flowInstanceId;
87
     private String flowInstanceId;
65
-	/**计算结果值(多个值通过字段拼接)*/
66
-	@Excel(name = "计算结果值(多个值通过字段拼接)", width = 15)
67
-    @ApiModelProperty(value = "计算结果值(多个值通过字段拼接)")
88
+    /**
89
+     * 本阶成本
90
+     */
91
+    @Excel(name = "本阶成本", width = 15)
92
+    @ApiModelProperty(value = "本阶成本")
68
     private String countValue;
93
     private String countValue;
69
-	/**创建时间*/
70
-	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
71
-    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
94
+    /**
95
+     * 创建时间
96
+     */
97
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
98
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
72
     @ApiModelProperty(value = "创建时间")
99
     @ApiModelProperty(value = "创建时间")
73
     private Date createTime;
100
     private Date createTime;
74
-	/**创建人*/
101
+    /**
102
+     * 创建人
103
+     */
75
     @ApiModelProperty(value = "创建人")
104
     @ApiModelProperty(value = "创建人")
76
     private Integer createBy;
105
     private Integer createBy;
106
+    /**
107
+     * 总计成本
108
+     */
109
+    @Excel(name = "总计成本", width = 15)
110
+    @ApiModelProperty(value = "总计成本")
111
+    private String totalValue;
112
+    /**
113
+     * 成本类别
114
+     */
115
+    @Excel(name = "成本类别", width = 15)
116
+    @ApiModelProperty(value = "成本类别")
117
+    private String costType;
77
 }
118
 }

+ 58
- 0
qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/enums/FeeTypeEnum.java 查看文件

1
+package com.zzsmart.qomo.kn.cost.manage.enums;
2
+
3
+/**
4
+ * @Classname StandardStageEnum
5
+ * @Description 阶段枚举
6
+ * @Version 1.0.0
7
+ * @Date 2024/6/18 9:51
8
+ * @Created wangqiong
9
+ */
10
+public enum FeeTypeEnum {
11
+    EquipmentFee("EquipmentFee", "机器折旧费"), SupplyMaterialFee("SupplyMaterialFee", "辅料费"), DriverFee("DriverFee", "水电费"), OtherFee("OtherFee", "其他费用"), LogisticsFee("LogisticsFee", "物流费");
12
+
13
+    private final String code;
14
+    private final String text;
15
+
16
+    FeeTypeEnum(String code, String text) {
17
+        this.code = code;
18
+        this.text = text;
19
+    }
20
+
21
+    public String getCode() {
22
+        return code;
23
+    }
24
+
25
+    public String getText() {
26
+        return text;
27
+    }
28
+
29
+    /**
30
+     * 根据code获取text
31
+     *
32
+     * @param codeNo
33
+     * @return
34
+     */
35
+    public static String getTextByCode(String codeNo) {
36
+        for (FeeTypeEnum value : FeeTypeEnum.values()) {
37
+            if (value.getCode().equals(codeNo)) {
38
+                return value.getText();
39
+            }
40
+        }
41
+        return codeNo.toString();
42
+    }
43
+
44
+    /**
45
+     * 根据text获取code
46
+     *
47
+     * @param textStr
48
+     * @return
49
+     */
50
+    public static String getCodeByText(String textStr) {
51
+        for (FeeTypeEnum value : FeeTypeEnum.values()) {
52
+            if (value.getText().equals(textStr)) {
53
+                return value.getText();
54
+            }
55
+        }
56
+        return textStr;
57
+    }
58
+}

+ 11
- 16
qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/enums/StandardStageEnum.java 查看文件

8
  * @Created wangqiong
8
  * @Created wangqiong
9
  */
9
  */
10
 public enum StandardStageEnum {
10
 public enum StandardStageEnum {
11
-    INIT("A", "初始"),
12
-    FIRST_BATCH("B", "首批"),
13
-    MASS_PRODUCTION("C", "量产"),
14
-
15
-
16
-    ;
11
+    INIT("A", "初始"), FIRST_BATCH("B", "首批"), MASS_PRODUCTION("C", "量产");
17
 
12
 
18
     private final String code;
13
     private final String code;
19
     private final String text;
14
     private final String text;
20
 
15
 
21
-    StandardStageEnum(String code, String text)
22
-    {
16
+    StandardStageEnum(String code, String text) {
23
         this.code = code;
17
         this.code = code;
24
         this.text = text;
18
         this.text = text;
25
     }
19
     }
26
 
20
 
27
-    public String getCode()
28
-    {
21
+    public String getCode() {
29
         return code;
22
         return code;
30
     }
23
     }
31
 
24
 
32
-    public String getText()
33
-    {
25
+    public String getText() {
34
         return text;
26
         return text;
35
     }
27
     }
28
+
36
     /**
29
     /**
37
      * 根据code获取text
30
      * 根据code获取text
31
+     *
38
      * @param codeNo
32
      * @param codeNo
39
      * @return
33
      * @return
40
      */
34
      */
41
-    public static String getTextByCode(String codeNo){
35
+    public static String getTextByCode(String codeNo) {
42
         for (StandardStageEnum value : StandardStageEnum.values()) {
36
         for (StandardStageEnum value : StandardStageEnum.values()) {
43
-            if (value.getCode().equals(codeNo)){
37
+            if (value.getCode().equals(codeNo)) {
44
                 return value.getText();
38
                 return value.getText();
45
             }
39
             }
46
         }
40
         }
49
 
43
 
50
     /**
44
     /**
51
      * 根据text获取code
45
      * 根据text获取code
46
+     *
52
      * @param textStr
47
      * @param textStr
53
      * @return
48
      * @return
54
      */
49
      */
55
-    public static String getCodeByText(String textStr){
50
+    public static String getCodeByText(String textStr) {
56
         for (StandardStageEnum value : StandardStageEnum.values()) {
51
         for (StandardStageEnum value : StandardStageEnum.values()) {
57
-            if (value.getText().equals(textStr)){
52
+            if (value.getText().equals(textStr)) {
58
                 return value.getText();
53
                 return value.getText();
59
             }
54
             }
60
         }
55
         }

+ 5
- 0
qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/mapper/CostMaterialBomMapper.java 查看文件

1
 package com.zzsmart.qomo.kn.cost.manage.mapper;
1
 package com.zzsmart.qomo.kn.cost.manage.mapper;
2
 
2
 
3
+import com.alibaba.fastjson.JSONObject;
3
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4
 import com.zzsmart.qomo.kn.cost.manage.entity.CostMaterialBom;
5
 import com.zzsmart.qomo.kn.cost.manage.entity.CostMaterialBom;
5
 import org.apache.ibatis.annotations.Mapper;
6
 import org.apache.ibatis.annotations.Mapper;
26
      */
27
      */
27
     @Select("${selectCommand}")
28
     @Select("${selectCommand}")
28
     List<CostMaterialBom> customSelect(@Param("selectCommand") String selectCommand);
29
     List<CostMaterialBom> customSelect(@Param("selectCommand") String selectCommand);
30
+
31
+
32
+    @Select("${selectSql}")
33
+    JSONObject customSelectOne(@Param("selectSql") String selectSql);
29
 }
34
 }

+ 489
- 0
qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/StandardCostService.java 查看文件

1
+package com.zzsmart.qomo.kn.cost.manage.plugin;
2
+
3
+import com.alibaba.fastjson.JSON;
4
+import com.alibaba.fastjson.JSONObject;
5
+import com.zzsmart.qomo.dao.entity.FlowDefinition;
6
+import com.zzsmart.qomo.kn.cost.manage.entity.AppSceneCostResultValue;
7
+import com.zzsmart.qomo.kn.cost.manage.entity.CostMaterialBom;
8
+import com.zzsmart.qomo.kn.cost.manage.entity.CostMaterialProcessHours;
9
+import com.zzsmart.qomo.kn.cost.manage.entity.HourRate;
10
+import com.zzsmart.qomo.kn.cost.manage.enums.FeeTypeEnum;
11
+import com.zzsmart.qomo.kn.cost.manage.mapper.CostMaterialBomMapper;
12
+import com.zzsmart.qomo.kn.cost.manage.service.CostMaterialProcessHoursService;
13
+import com.zzsmart.qomo.kn.cost.manage.service.CostPurchasePriceService;
14
+import com.zzsmart.qomo.kn.cost.manage.service.IAppSceneCostResultValueService;
15
+import com.zzsmart.qomo.kn.cost.manage.service.IHourRateService;
16
+import com.zzsmart.qomo.kn.cost.manage.vo.FlowTaskInfoVO;
17
+import com.zzsmart.qomo.plugin.task.api.TaskExecutionContext;
18
+import lombok.extern.slf4j.Slf4j;
19
+import org.springframework.beans.factory.annotation.Autowired;
20
+import org.springframework.stereotype.Service;
21
+
22
+import javax.annotation.PostConstruct;
23
+import java.math.BigDecimal;
24
+import java.util.ArrayList;
25
+import java.util.List;
26
+import java.util.Map;
27
+import java.util.stream.Collectors;
28
+
29
+@Service
30
+@Slf4j
31
+public class StandardCostService {
32
+    /**
33
+     * 物料BOM信息
34
+     */
35
+    @Autowired
36
+    CostMaterialBomMapper costMaterialBomMapper;
37
+
38
+    /**
39
+     * 小时费率
40
+     */
41
+    @Autowired
42
+    IHourRateService iHourRateService;
43
+    /**
44
+     * 采购单价
45
+     */
46
+    @Autowired
47
+    CostPurchasePriceService costPurchasePriceService;
48
+    /**
49
+     * 工序
50
+     */
51
+    @Autowired
52
+    CostMaterialProcessHoursService costMaterialProcessHoursService;
53
+    /**
54
+     * 标准成本计算结果
55
+     */
56
+    @Autowired
57
+    IAppSceneCostResultValueService iAppSceneCostResultValueService;
58
+    public static StandardCostService standardCostService;
59
+
60
+    @PostConstruct
61
+    public void init() {
62
+        standardCostService = this;
63
+        standardCostService.costMaterialBomMapper = this.costMaterialBomMapper;
64
+        standardCostService.costPurchasePriceService = this.costPurchasePriceService;
65
+        standardCostService.iHourRateService = this.iHourRateService;
66
+        standardCostService.costMaterialProcessHoursService = this.costMaterialProcessHoursService;
67
+        standardCostService.iAppSceneCostResultValueService = this.iAppSceneCostResultValueService;
68
+    }
69
+
70
+
71
+    /**
72
+     * 1.物料编号输入任务
73
+     */
74
+    public static void materialInputTask(TaskExecutionContext parameters) {
75
+        try {
76
+            //获取任务流程相关信息
77
+            FlowTaskInfoVO flowTaskInfoVO = analysisFlowTaskInfo(parameters);
78
+            //获取最上层的物料号
79
+            String topMaterialCode = flowTaskInfoVO.getTopMaterialCode();
80
+            //获取任务类型
81
+            String taskType = parameters.getTaskType();
82
+            //获取任务代码
83
+            String taskCode = flowTaskInfoVO.getTaskCode();
84
+            //获取流程id
85
+            String flowInstanceId = flowTaskInfoVO.getFlowInstanceId();
86
+            //1.查询出所有满足物料编号的物料(BOM物料)
87
+            String sql = flowTaskInfoVO.getSqlString();
88
+            List<CostMaterialBom> list = standardCostService.costMaterialBomMapper.customSelect(sql);
89
+            log.info("Full EmptyTask list: {}", list);
90
+            //2.把查询的结果存放在临时表里(表命名规则:前缀_流程id_组件code)
91
+            for (int i = 0; list != null && i < list.size(); i++) {
92
+                CostMaterialBom material = list.get(i);
93
+                AppSceneCostResultValue appSceneCostResultValue = AppSceneCostResultValue.builder().belongTopMaterialNo(topMaterialCode).marterialNo(material.getMaterialCode()).parentMarterialNo(material.getParentMaterialCode()).taskType(taskType).taskCode(taskCode).flowInstanceId(flowInstanceId).build();
94
+                standardCostService.iAppSceneCostResultValueService.save(appSceneCostResultValue);
95
+            }
96
+        } catch (Exception e) {
97
+            throw new RuntimeException(e);
98
+        }
99
+    }
100
+
101
+    /**
102
+     * 获取任务流程相关信息
103
+     *
104
+     * @param parameters
105
+     * @return
106
+     */
107
+    private static FlowTaskInfoVO analysisFlowTaskInfo(TaskExecutionContext parameters) {
108
+        FlowTaskInfoVO flowTaskInfoVO = new FlowTaskInfoVO();
109
+        if (parameters != null) {
110
+            String s = parameters.toString();
111
+            String[] split = s.split(",");
112
+            for (int i = 0; i < split.length; i++) {
113
+                String s1 = split[i];
114
+                if (s1.contains("taskType")) {
115
+                    String[] split1 = s1.split("=");
116
+                    flowTaskInfoVO.setTaskType(split1[1]);
117
+                } else if (s1.contains("taskCode")) {
118
+                    String[] split1 = s1.split(":");
119
+                    flowTaskInfoVO.setTaskCode(split1[1]);
120
+                } else if (s1.contains("flowInstanceId")) {
121
+                    String[] split1 = s1.split("=");
122
+                    flowTaskInfoVO.setFlowInstanceId(split1[1]);
123
+                } else if (s1.contains("sqlString")) {
124
+                    String[] split1 = s1.split(":");
125
+                    flowTaskInfoVO.setSqlString(split1[1]);
126
+                }
127
+            }
128
+        }
129
+        //通过任务流程id查询流程定义信息(qomo_flow_definition)
130
+        flowTaskInfoVO = queryFlowDefinitionByFlowInstanceId(flowTaskInfoVO);
131
+        return flowTaskInfoVO;
132
+    }
133
+
134
+    /**
135
+     * @param flowTaskInfoVO
136
+     */
137
+    private static FlowTaskInfoVO queryFlowDefinitionByFlowInstanceId(FlowTaskInfoVO flowTaskInfoVO) {
138
+        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";
139
+        JSONObject jsonObject = standardCostService.costMaterialBomMapper.customSelectOne(sql);
140
+        FlowDefinition flowDefinition = JSON.toJavaObject(jsonObject, FlowDefinition.class);
141
+        if (flowDefinition != null) {
142
+            log.info("flowDefinition: {}", flowDefinition);
143
+            String modelJson = flowDefinition.getModelJson();
144
+            JSONObject jsonObject1 = JSON.parseObject(modelJson);
145
+            if (jsonObject1 != null) {
146
+                String topMaterialCode = jsonObject1.getString("topMaterialCode");
147
+                flowTaskInfoVO.setTopMaterialCode(topMaterialCode);
148
+            }
149
+        }
150
+        return flowTaskInfoVO;
151
+    }
152
+
153
+    /**
154
+     * 2. 物料成本任务
155
+     */
156
+    public static void materialCostTask(TaskExecutionContext parameters) {
157
+        try {
158
+            //获取任务流程相关信息
159
+            FlowTaskInfoVO flowTaskInfoVO = analysisFlowTaskInfo(parameters);
160
+            //获取最上层的物料号
161
+            String topMaterialCode = flowTaskInfoVO.getTopMaterialCode();
162
+            //获取任务类型
163
+            String taskType = parameters.getTaskType();
164
+            //获取任务代码
165
+            String taskCode = flowTaskInfoVO.getTaskCode();
166
+            //获取流程id
167
+            String flowInstanceId = flowTaskInfoVO.getFlowInstanceId();
168
+            //1.查询出物料编号对应的下所有的BOM信息
169
+            List<AppSceneCostResultValue> list = standardCostService.iAppSceneCostResultValueService.getResultValueByTopMaterialNo(topMaterialCode, "MaterialInput", flowInstanceId);
170
+            //2.计算出所有的单个物料的物料成本
171
+            //2.1查询出物料的单价和采购数量
172
+            List<String> MarterialNoList = new ArrayList<>();
173
+            if (list != null && list.size() > 0) {
174
+                MarterialNoList = list.stream().filter(s -> s.getMarterialNo() != null).map(AppSceneCostResultValue::getMarterialNo).collect(Collectors.toList());
175
+            }
176
+            //查询物料的采购价
177
+            Map<String, BigDecimal> purchasePriceMap = standardCostService.costPurchasePriceService.getMinCostPurchasePriceByMaterialNo(MarterialNoList);
178
+            for (int i = 0; i < list.size(); i++) {
179
+                AppSceneCostResultValue appSceneCostResultValue = list.get(i);
180
+                String marterialNo = appSceneCostResultValue.getMarterialNo();
181
+                Integer num = appSceneCostResultValue.getNum();
182
+                if (marterialNo != null) {
183
+                    BigDecimal price = purchasePriceMap.get(marterialNo);
184
+                    BigDecimal number = new BigDecimal(num.toString());
185
+                    //单价乘以数量
186
+                    BigDecimal totalCost = price.multiply(number);
187
+                    //2.2计算出人工成本并存储到成本结果数据表中
188
+                    AppSceneCostResultValue resultValue = AppSceneCostResultValue.builder().belongTopMaterialNo(topMaterialCode).marterialNo(marterialNo).parentMarterialNo(appSceneCostResultValue.getParentMarterialNo()).taskType(taskType).taskCode(taskCode).flowInstanceId(flowInstanceId).countValue(totalCost + "").build();
189
+                    standardCostService.iAppSceneCostResultValueService.save(resultValue);
190
+                }
191
+            }
192
+        } catch (Exception e) {
193
+            throw new RuntimeException(e);
194
+        }
195
+    }
196
+
197
+    /**
198
+     * 3.人工成本任务
199
+     */
200
+    public static void laborCostTask(TaskExecutionContext parameters) {
201
+        try {
202
+            //获取任务流程相关信息
203
+            FlowTaskInfoVO flowTaskInfoVO = analysisFlowTaskInfo(parameters);
204
+            //获取最上层的物料号
205
+            String topMaterialCode = flowTaskInfoVO.getTopMaterialCode();
206
+            //获取任务类型
207
+            String taskType = parameters.getTaskType();
208
+            //获取任务代码
209
+            String taskCode = flowTaskInfoVO.getTaskCode();
210
+            //获取流程id
211
+            String flowInstanceId = flowTaskInfoVO.getFlowInstanceId();
212
+            String sql = flowTaskInfoVO.getSqlString();
213
+            JSONObject jsonObject = standardCostService.costMaterialBomMapper.customSelectOne(sql);
214
+            BigDecimal hourRate = new BigDecimal("0");
215
+            if (jsonObject != null) {
216
+                HourRate rate = JSON.toJavaObject(jsonObject, HourRate.class);
217
+                hourRate = rate.getLaborHourRate();
218
+            }
219
+            //1.查询出物料编号对应的下所有的BOM信息
220
+            List<AppSceneCostResultValue> list = standardCostService.iAppSceneCostResultValueService.getResultValueByTopMaterialNo(topMaterialCode, "MaterialInput", flowInstanceId);
221
+            //2.计算出所有的单个物料的人工成本
222
+            //2.1查询出物料的人员工时和人工小时费率(涉及:小时费率表和工序表)
223
+            List<String> MarterialNoList = new ArrayList<>();
224
+            if (list != null && list.size() > 0) {
225
+                MarterialNoList = list.stream().filter(s -> s.getMarterialNo() != null).map(AppSceneCostResultValue::getMarterialNo).collect(Collectors.toList());
226
+            }
227
+            //查询工序工时
228
+            Map<String, List<CostMaterialProcessHours>> processHoursMap = standardCostService.costMaterialProcessHoursService.getProcessHoursByMaterialNo(MarterialNoList);
229
+            for (int i = 0; i < list.size(); i++) {
230
+                AppSceneCostResultValue appSceneCostResultValue = list.get(i);
231
+                String marterialNo = appSceneCostResultValue.getMarterialNo();
232
+                if (marterialNo != null) {
233
+                    BigDecimal totalCost = new BigDecimal("0.0");
234
+                    List<CostMaterialProcessHours> costMaterialProcessHours = processHoursMap.get(marterialNo);
235
+                    if (costMaterialProcessHours != null && costMaterialProcessHours.size() > 0) {
236
+                        for (int j = 0; j < costMaterialProcessHours.size(); j++) {
237
+                            CostMaterialProcessHours processHours = costMaterialProcessHours.get(j);
238
+                            BigDecimal laborHours = processHours.getLaborHours();
239
+                            //计算总人工成本
240
+                            totalCost = totalCost.add(laborHours.multiply(hourRate));
241
+                        }
242
+                    }
243
+                    //2.2计算出人工成本并存储到成本结果数据表中
244
+                    AppSceneCostResultValue resultValue = AppSceneCostResultValue.builder().belongTopMaterialNo(topMaterialCode).marterialNo(marterialNo).parentMarterialNo(appSceneCostResultValue.getParentMarterialNo()).taskType(taskType).taskCode(taskCode).flowInstanceId(flowInstanceId).countValue(totalCost + "").build();
245
+                    standardCostService.iAppSceneCostResultValueService.save(resultValue);
246
+                }
247
+            }
248
+        } catch (Exception e) {
249
+            throw new RuntimeException(e);
250
+        }
251
+
252
+    }
253
+
254
+    /**
255
+     * 4.制造费用成本任务
256
+     */
257
+    public static void manufacturingCostTask(TaskExecutionContext parameters) {
258
+        try {
259
+            //获取任务流程相关信息
260
+            FlowTaskInfoVO flowTaskInfoVO = analysisFlowTaskInfo(parameters);
261
+            //获取最上层的物料号
262
+            String topMaterialCode = flowTaskInfoVO.getTopMaterialCode();
263
+            //获取任务类型
264
+            String taskType = parameters.getTaskType();
265
+            //获取任务代码
266
+            String taskCode = flowTaskInfoVO.getTaskCode();
267
+            //获取流程id
268
+            String flowInstanceId = flowTaskInfoVO.getFlowInstanceId();
269
+            /**
270
+             * 费用类别
271
+             */
272
+            String feeType = flowTaskInfoVO.getFeeType();
273
+            /**
274
+             * 小时费率
275
+             */
276
+            String sql = flowTaskInfoVO.getSqlString();
277
+            JSONObject jsonObject = standardCostService.costMaterialBomMapper.customSelectOne(sql);
278
+            BigDecimal hourRate = new BigDecimal("0");
279
+            if (jsonObject != null) {
280
+                HourRate rate = JSON.toJavaObject(jsonObject, HourRate.class);
281
+                hourRate = rate.getLaborHourRate();
282
+            }
283
+            //1.查询出物料编号对应的下所有的BOM信息
284
+            List<AppSceneCostResultValue> list = standardCostService.iAppSceneCostResultValueService.getResultValueByTopMaterialNo(topMaterialCode, "MaterialInput", flowInstanceId);
285
+            //2.根据费用类型进行不同的费用计算
286
+            //查询工序工时
287
+            List<String> MarterialNoList = new ArrayList<>();
288
+            if (list != null && list.size() > 0) {
289
+                MarterialNoList = list.stream().filter(s -> s.getMarterialNo() != null).map(AppSceneCostResultValue::getMarterialNo).collect(Collectors.toList());
290
+            }
291
+            Map<String, List<CostMaterialProcessHours>> processHoursMap = standardCostService.costMaterialProcessHoursService.getProcessHoursByMaterialNo(MarterialNoList);
292
+            //2.1机器折旧费(机器工时*费率)
293
+            if (FeeTypeEnum.EquipmentFee.getCode().equals(feeType)) {
294
+                for (int i = 0; i < list.size(); i++) {
295
+                    AppSceneCostResultValue appSceneCostResultValue = list.get(i);
296
+                    String marterialNo = appSceneCostResultValue.getMarterialNo();
297
+                    if (marterialNo != null) {
298
+                        BigDecimal totalCost = new BigDecimal("0.0");
299
+                        List<CostMaterialProcessHours> costMaterialProcessHours = processHoursMap.get(marterialNo);
300
+                        if (costMaterialProcessHours != null && costMaterialProcessHours.size() > 0) {
301
+                            for (int j = 0; j < costMaterialProcessHours.size(); j++) {
302
+                                CostMaterialProcessHours processHours = costMaterialProcessHours.get(j);
303
+                                BigDecimal laborHours = processHours.getDeviceHours();
304
+                                //计算机器成本
305
+                                totalCost = totalCost.add(laborHours.multiply(hourRate));
306
+                            }
307
+                        }
308
+                        //2.2计算机器成本并存储到成本结果数据表中
309
+                        AppSceneCostResultValue resultValue = AppSceneCostResultValue.builder().belongTopMaterialNo(topMaterialCode).marterialNo(marterialNo).parentMarterialNo(appSceneCostResultValue.getParentMarterialNo()).taskType(taskType).taskCode(taskCode).flowInstanceId(flowInstanceId).countValue(totalCost + "").build();
310
+                        standardCostService.iAppSceneCostResultValueService.save(resultValue);
311
+                    }
312
+                }
313
+            } else if (FeeTypeEnum.SupplyMaterialFee.getCode().equals(feeType)) {
314
+                //机物料消耗(辅料工时*费率)
315
+                for (int i = 0; i < list.size(); i++) {
316
+                    AppSceneCostResultValue appSceneCostResultValue = list.get(i);
317
+                    String marterialNo = appSceneCostResultValue.getMarterialNo();
318
+                    if (marterialNo != null) {
319
+                        BigDecimal totalCost = new BigDecimal("0.0");
320
+                        List<CostMaterialProcessHours> costMaterialProcessHours = processHoursMap.get(marterialNo);
321
+                        if (costMaterialProcessHours != null && costMaterialProcessHours.size() > 0) {
322
+                            for (int j = 0; j < costMaterialProcessHours.size(); j++) {
323
+                                CostMaterialProcessHours processHours = costMaterialProcessHours.get(j);
324
+                                //TODO 辅料工时来源
325
+                                BigDecimal laborHours = processHours.getLaborHours();
326
+                                //机物料消耗
327
+                                totalCost = totalCost.add(laborHours.multiply(hourRate));
328
+                            }
329
+                        }
330
+                        //2.2计算机物料消耗存储到成本结果数据表中
331
+                        AppSceneCostResultValue resultValue = AppSceneCostResultValue.builder().belongTopMaterialNo(topMaterialCode).marterialNo(marterialNo).parentMarterialNo(appSceneCostResultValue.getParentMarterialNo()).taskType(taskType).taskCode(taskCode).flowInstanceId(flowInstanceId).countValue(totalCost + "").build();
332
+                        standardCostService.iAppSceneCostResultValueService.save(resultValue);
333
+                    }
334
+                }
335
+            } else if (FeeTypeEnum.DriverFee.getCode().equals(feeType)) {
336
+                //2.3水电费(燃动力工时*费率)
337
+                for (int i = 0; i < list.size(); i++) {
338
+                    AppSceneCostResultValue appSceneCostResultValue = list.get(i);
339
+                    String marterialNo = appSceneCostResultValue.getMarterialNo();
340
+                    if (marterialNo != null) {
341
+                        BigDecimal totalCost = new BigDecimal("0.0");
342
+                        List<CostMaterialProcessHours> costMaterialProcessHours = processHoursMap.get(marterialNo);
343
+                        if (costMaterialProcessHours != null && costMaterialProcessHours.size() > 0) {
344
+                            for (int j = 0; j < costMaterialProcessHours.size(); j++) {
345
+                                CostMaterialProcessHours processHours = costMaterialProcessHours.get(j);
346
+                                //TODO 燃动力工时来源
347
+                                BigDecimal laborHours = processHours.getLaborHours();
348
+                                //机物料消耗
349
+                                totalCost = totalCost.add(laborHours.multiply(hourRate));
350
+                            }
351
+                        }
352
+                        //2.2计算机物料消耗存储到成本结果数据表中
353
+                        AppSceneCostResultValue resultValue = AppSceneCostResultValue.builder().belongTopMaterialNo(topMaterialCode).marterialNo(marterialNo).parentMarterialNo(appSceneCostResultValue.getParentMarterialNo()).taskType(taskType).taskCode(taskCode).flowInstanceId(flowInstanceId).countValue(totalCost + "").build();
354
+                        standardCostService.iAppSceneCostResultValueService.save(resultValue);
355
+                    }
356
+                }
357
+            } else if (FeeTypeEnum.OtherFee.getCode().equals(feeType)) {
358
+                //2.4其他制费(其他工时*费率)
359
+                for (int i = 0; i < list.size(); i++) {
360
+                    AppSceneCostResultValue appSceneCostResultValue = list.get(i);
361
+                    String marterialNo = appSceneCostResultValue.getMarterialNo();
362
+                    if (marterialNo != null) {
363
+                        BigDecimal totalCost = new BigDecimal("0.0");
364
+                        List<CostMaterialProcessHours> costMaterialProcessHours = processHoursMap.get(marterialNo);
365
+                        if (costMaterialProcessHours != null && costMaterialProcessHours.size() > 0) {
366
+                            for (int j = 0; j < costMaterialProcessHours.size(); j++) {
367
+                                CostMaterialProcessHours processHours = costMaterialProcessHours.get(j);
368
+                                //TODO 其他工时来源
369
+                                BigDecimal laborHours = processHours.getLaborHours();
370
+                                //机物料消耗
371
+                                totalCost = totalCost.add(laborHours.multiply(hourRate));
372
+                            }
373
+                        }
374
+                        //2.2计算机物料消耗存储到成本结果数据表中
375
+                        AppSceneCostResultValue resultValue = AppSceneCostResultValue.builder().belongTopMaterialNo(topMaterialCode).marterialNo(marterialNo).parentMarterialNo(appSceneCostResultValue.getParentMarterialNo()).taskType(taskType).taskCode(taskCode).flowInstanceId(flowInstanceId).countValue(totalCost + "").build();
376
+                        standardCostService.iAppSceneCostResultValueService.save(resultValue);
377
+                    }
378
+                }
379
+            } else if (FeeTypeEnum.LogisticsFee.getCode().equals(feeType)) {
380
+                //查出所有的机器折旧费、机物料消耗、水电费、其他制费
381
+                list = standardCostService.iAppSceneCostResultValueService.getResultValueByTopMaterialNo(topMaterialCode, "ManufacturingCost", flowInstanceId);
382
+                //2.5物流费((机器折旧+机物料消耗+水电费+其他制费)*10.16%)
383
+                //按照物料编号进行分组
384
+                Map<String, List<AppSceneCostResultValue>> materialNoMap = list.stream().collect(Collectors.groupingBy(AppSceneCostResultValue::getMarterialNo));
385
+                for (String key : materialNoMap.keySet()) {
386
+                    List<AppSceneCostResultValue> appSceneCostResultValues = materialNoMap.get(key);
387
+                    BigDecimal totalCost = new BigDecimal("0.0");
388
+                    for (int j = 0; j < appSceneCostResultValues.size(); j++) {
389
+                        AppSceneCostResultValue appSceneCostResultValue = appSceneCostResultValues.get(j);
390
+                        String countValue = appSceneCostResultValue.getCountValue();
391
+                        if (countValue != null) {
392
+                            totalCost = totalCost.add(new BigDecimal(countValue));
393
+                        }
394
+                    }
395
+                    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();
396
+                    standardCostService.iAppSceneCostResultValueService.save(resultValue);
397
+                }
398
+            }
399
+        } catch (Exception e) {
400
+            throw new RuntimeException(e);
401
+        }
402
+
403
+    }
404
+
405
+    /**
406
+     * 5.标准成本计算任务
407
+     */
408
+    public static void standardCostTask(TaskExecutionContext parameters) {
409
+        //获取任务流程相关信息
410
+        FlowTaskInfoVO flowTaskInfoVO = analysisFlowTaskInfo(parameters);
411
+        //获取最上层的物料号
412
+        String topMaterialCode = flowTaskInfoVO.getTopMaterialCode();
413
+        //获取任务类型
414
+        String taskType = parameters.getTaskType();
415
+        //获取任务代码
416
+        String taskCode = flowTaskInfoVO.getTaskCode();
417
+        //获取流程id
418
+        String flowInstanceId = flowTaskInfoVO.getFlowInstanceId();
419
+        //1.查询出物料编号对应的下所有的BOM信息
420
+        List<AppSceneCostResultValue> list = standardCostService.iAppSceneCostResultValueService.getResultValueByTopMaterialNo(topMaterialCode, null, flowInstanceId);
421
+        //2.计算出所有的单个物料的本阶的标准成本(标准成本=物料成本+人工成本+制造费用)
422
+        //按照物料编号进行分组
423
+        Map<String, List<AppSceneCostResultValue>> materialNoMap = list.stream().collect(Collectors.groupingBy(AppSceneCostResultValue::getMarterialNo));
424
+        for (String key : materialNoMap.keySet()) {
425
+            List<AppSceneCostResultValue> appSceneCostResultValues = materialNoMap.get(key);
426
+            //本阶成本
427
+            BigDecimal currentCost = new BigDecimal("0.0");
428
+            for (int j = 0; j < appSceneCostResultValues.size(); j++) {
429
+                AppSceneCostResultValue appSceneCostResultValue = appSceneCostResultValues.get(j);
430
+                String countValue = appSceneCostResultValue.getCountValue();
431
+                if (countValue != null) {
432
+                    currentCost = currentCost.add(new BigDecimal(countValue));
433
+                }
434
+            }
435
+            AppSceneCostResultValue resultValue = AppSceneCostResultValue.builder().belongTopMaterialNo(topMaterialCode).marterialNo(key).parentMarterialNo(appSceneCostResultValues.get(0).getParentMarterialNo()).taskType(taskType).taskCode(taskCode).flowInstanceId(flowInstanceId).countValue(currentCost.toString()).build();
436
+            standardCostService.iAppSceneCostResultValueService.save(resultValue);
437
+        }
438
+        //3.计算出所有的单个物料的累计标准成本
439
+        List<AppSceneCostResultValue> standardCostList = standardCostService.iAppSceneCostResultValueService.getResultValueByTopMaterialNo(topMaterialCode, taskType, flowInstanceId);
440
+        //循环算出各个物料的累计成本
441
+        totalCountCost(standardCostList, topMaterialCode, taskType, taskCode, flowInstanceId);
442
+    }
443
+
444
+    /**
445
+     * 循环算出各个物料的累计成本
446
+     *
447
+     * @param standardCostList
448
+     * @param topMaterialCode
449
+     * @param taskType
450
+     * @param taskCode
451
+     * @param flowInstanceId
452
+     */
453
+    private static void totalCountCost(List<AppSceneCostResultValue> standardCostList, String topMaterialCode, String taskType, String taskCode, String flowInstanceId) {
454
+        Map<String, List<AppSceneCostResultValue>> parentMaterialNoMap = standardCostList.stream().filter(appSceneCostResultValue -> appSceneCostResultValue.getParentMarterialNo() != null).collect(Collectors.groupingBy(AppSceneCostResultValue::getParentMarterialNo));
455
+        for (int i = 0; i < standardCostList.size(); i++) {
456
+            AppSceneCostResultValue appSceneCostResultValue = standardCostList.get(i);
457
+            BigDecimal totalCost = new BigDecimal("0.0");
458
+            totalCost = loopCount(appSceneCostResultValue, parentMaterialNoMap, topMaterialCode, taskType, taskCode, flowInstanceId, totalCost);
459
+            appSceneCostResultValue.setTotalValue(totalCost.toString());
460
+            standardCostService.iAppSceneCostResultValueService.save(appSceneCostResultValue);
461
+        }
462
+    }
463
+
464
+    /**
465
+     * 递归计算出累计成本
466
+     *
467
+     * @param appSceneCostResultValue
468
+     * @param parentMaterialNoMap
469
+     * @param topMaterialCode
470
+     * @param taskType
471
+     * @param taskCode
472
+     * @param flowInstanceId
473
+     */
474
+    private static BigDecimal loopCount(AppSceneCostResultValue appSceneCostResultValue, Map<String, List<AppSceneCostResultValue>> parentMaterialNoMap, String topMaterialCode, String taskType, String taskCode, String flowInstanceId, BigDecimal totalCost) {
475
+        String marterialNo = appSceneCostResultValue.getMarterialNo();
476
+        if (parentMaterialNoMap.containsKey(marterialNo)) {
477
+            List<AppSceneCostResultValue> appSceneCostResultValues = parentMaterialNoMap.get(marterialNo);
478
+            for (int j = 0; j < appSceneCostResultValues.size(); j++) {
479
+                AppSceneCostResultValue appSceneCostResultValue1 = appSceneCostResultValues.get(j);
480
+                String countValue = appSceneCostResultValue1.getCountValue();
481
+                if (countValue != null) {
482
+                    totalCost = totalCost.add(new BigDecimal(countValue));
483
+                }
484
+                loopCount(appSceneCostResultValue1, parentMaterialNoMap, topMaterialCode, taskType, taskCode, flowInstanceId, totalCost);
485
+            }
486
+        }
487
+        return totalCost;
488
+    }
489
+}

+ 1
- 1
qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/laborcost/LaborCostTask.java 查看文件

17
 
17
 
18
 package com.zzsmart.qomo.kn.cost.manage.plugin.laborcost;
18
 package com.zzsmart.qomo.kn.cost.manage.plugin.laborcost;
19
 
19
 
20
-import com.zzsmart.qomo.kn.cost.manage.plugin.materialinput.StandardCostService;
20
+import com.zzsmart.qomo.kn.cost.manage.plugin.StandardCostService;
21
 import com.zzsmart.qomo.plugin.task.api.*;
21
 import com.zzsmart.qomo.plugin.task.api.*;
22
 import com.zzsmart.qomo.plugin.task.api.parameters.AbstractParameters;
22
 import com.zzsmart.qomo.plugin.task.api.parameters.AbstractParameters;
23
 
23
 

+ 1
- 9
qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/manufacturingcost/ManufacturingCostTask.java 查看文件

17
 
17
 
18
 package com.zzsmart.qomo.kn.cost.manage.plugin.manufacturingcost;
18
 package com.zzsmart.qomo.kn.cost.manage.plugin.manufacturingcost;
19
 
19
 
20
-import com.zzsmart.qomo.kn.cost.manage.entity.AppSceneCostResultValue;
21
-import com.zzsmart.qomo.kn.cost.manage.entity.CostMaterialBom;
22
-import com.zzsmart.qomo.kn.cost.manage.mapper.CostMaterialBomMapper;
23
-import com.zzsmart.qomo.kn.cost.manage.plugin.materialinput.StandardCostService;
24
-import com.zzsmart.qomo.kn.cost.manage.service.IAppSceneCostResultValueService;
20
+import com.zzsmart.qomo.kn.cost.manage.plugin.StandardCostService;
25
 import com.zzsmart.qomo.plugin.task.api.*;
21
 import com.zzsmart.qomo.plugin.task.api.*;
26
 import com.zzsmart.qomo.plugin.task.api.parameters.AbstractParameters;
22
 import com.zzsmart.qomo.plugin.task.api.parameters.AbstractParameters;
27
-import org.springframework.beans.factory.annotation.Autowired;
28
-
29
-import java.util.Date;
30
-import java.util.List;
31
 
23
 
32
 /**
24
 /**
33
  * 制造费用成本任务
25
  * 制造费用成本任务

+ 3
- 11
qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/materialcost/MaterialCostTask.java 查看文件

17
 
17
 
18
 package com.zzsmart.qomo.kn.cost.manage.plugin.materialcost;
18
 package com.zzsmart.qomo.kn.cost.manage.plugin.materialcost;
19
 
19
 
20
-import com.zzsmart.qomo.kn.cost.manage.entity.AppSceneCostResultValue;
21
-import com.zzsmart.qomo.kn.cost.manage.entity.CostMaterialBom;
22
-import com.zzsmart.qomo.kn.cost.manage.mapper.CostMaterialBomMapper;
23
-import com.zzsmart.qomo.kn.cost.manage.plugin.materialinput.StandardCostService;
24
-import com.zzsmart.qomo.kn.cost.manage.service.IAppSceneCostResultValueService;
20
+import com.zzsmart.qomo.kn.cost.manage.plugin.StandardCostService;
25
 import com.zzsmart.qomo.plugin.task.api.*;
21
 import com.zzsmart.qomo.plugin.task.api.*;
26
 import com.zzsmart.qomo.plugin.task.api.parameters.AbstractParameters;
22
 import com.zzsmart.qomo.plugin.task.api.parameters.AbstractParameters;
27
-import org.springframework.beans.factory.annotation.Autowired;
28
-
29
-import java.util.Date;
30
-import java.util.List;
31
 
23
 
32
 /**
24
 /**
33
  * 物料成本计算任务
25
  * 物料成本计算任务
62
 
54
 
63
     @Override
55
     @Override
64
     public void handle(TaskCallBack taskCallBack) throws TaskException {
56
     public void handle(TaskCallBack taskCallBack) throws TaskException {
65
-        log.info("Full EmptyTask parameters: {}", taskRequest);
57
+        log.info("Full EmptyTask parameters: {}", taskExecutionContext);
66
         try {
58
         try {
67
-            StandardCostService.materialCostTask(taskRequest);
59
+            StandardCostService.materialCostTask(taskExecutionContext);
68
         } catch (Exception e) {
60
         } catch (Exception e) {
69
             //运行失败退出
61
             //运行失败退出
70
             setExitStatusCode(TaskConstants.EXIT_CODE_FAILURE);
62
             setExitStatusCode(TaskConstants.EXIT_CODE_FAILURE);

+ 1
- 0
qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/materialinput/MaterialInputTask.java 查看文件

17
 
17
 
18
 package com.zzsmart.qomo.kn.cost.manage.plugin.materialinput;
18
 package com.zzsmart.qomo.kn.cost.manage.plugin.materialinput;
19
 
19
 
20
+import com.zzsmart.qomo.kn.cost.manage.plugin.StandardCostService;
20
 import com.zzsmart.qomo.plugin.task.api.*;
21
 import com.zzsmart.qomo.plugin.task.api.*;
21
 import com.zzsmart.qomo.plugin.task.api.parameters.AbstractParameters;
22
 import com.zzsmart.qomo.plugin.task.api.parameters.AbstractParameters;
22
 
23
 

+ 0
- 169
qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/materialinput/StandardCostService.java 查看文件

1
-package com.zzsmart.qomo.kn.cost.manage.plugin.materialinput;
2
-
3
-import com.zzsmart.qomo.kn.cost.manage.entity.AppSceneCostResultValue;
4
-import com.zzsmart.qomo.kn.cost.manage.entity.CostMaterialBom;
5
-import com.zzsmart.qomo.kn.cost.manage.entity.CostMaterialProcessHours;
6
-import com.zzsmart.qomo.kn.cost.manage.mapper.CostMaterialBomMapper;
7
-import com.zzsmart.qomo.kn.cost.manage.service.CostMaterialProcessHoursService;
8
-import com.zzsmart.qomo.kn.cost.manage.service.IAppSceneCostResultValueService;
9
-import com.zzsmart.qomo.kn.cost.manage.service.IHourRateService;
10
-import com.zzsmart.qomo.plugin.task.api.TaskExecutionContext;
11
-import lombok.extern.slf4j.Slf4j;
12
-import org.springframework.beans.factory.annotation.Autowired;
13
-import org.springframework.stereotype.Service;
14
-
15
-import javax.annotation.PostConstruct;
16
-import java.math.BigDecimal;
17
-import java.util.ArrayList;
18
-import java.util.List;
19
-import java.util.Map;
20
-import java.util.stream.Collectors;
21
-
22
-@Service
23
-@Slf4j
24
-public class StandardCostService {
25
-    /**
26
-     * 物料BOM信息
27
-     */
28
-    @Autowired
29
-    CostMaterialBomMapper costMaterialBomMapper;
30
-
31
-    /**
32
-     * 小时费率
33
-     */
34
-    @Autowired
35
-    IHourRateService iHourRateService;
36
-    /**
37
-     * 工序
38
-     */
39
-    @Autowired
40
-    CostMaterialProcessHoursService costMaterialProcessHoursService;
41
-    /**
42
-     * 标准成本计算结果
43
-     */
44
-    @Autowired
45
-    IAppSceneCostResultValueService iAppSceneCostResultValueService;
46
-    public static StandardCostService standardCostService;
47
-
48
-    @PostConstruct
49
-    public void init() {
50
-        standardCostService = this;
51
-        standardCostService.costMaterialBomMapper = this.costMaterialBomMapper;
52
-        standardCostService.iHourRateService = this.iHourRateService;
53
-        standardCostService.costMaterialProcessHoursService = this.costMaterialProcessHoursService;
54
-        standardCostService.iAppSceneCostResultValueService = this.iAppSceneCostResultValueService;
55
-    }
56
-
57
-
58
-    /**
59
-     * 物料编号输入任务
60
-     */
61
-    public static void materialInputTask(TaskExecutionContext parameters) {
62
-        try {
63
-            //获取最上层的物料号
64
-            String materialCode = "";
65
-            //获取任务类型
66
-            String taskType = "";
67
-            //获取任务代码
68
-            String taskCode = "";
69
-            //获取流程id
70
-            String flowInstanceId = "1";
71
-            //1.查询出所有满足物料编号的物料(BOM物料)
72
-            String sql = "select * from app_scene_cost_material_bom ";
73
-            List<CostMaterialBom> list = standardCostService.costMaterialBomMapper.customSelect(sql);
74
-            log.info("Full EmptyTask list: {}", list);
75
-            //2.把查询的结果存放在临时表里(表命名规则:前缀_流程id_组件code)
76
-            for (int i = 0; list != null && i < list.size(); i++) {
77
-                CostMaterialBom material = list.get(i);
78
-                AppSceneCostResultValue appSceneCostResultValue = AppSceneCostResultValue.builder().belongTopMaterialNo(materialCode).marterialNo(material.getMaterialCode()).parentMarterialNo(material.getParentMaterialCode()).taskType(taskType).taskCode(taskCode).flowInstanceId(flowInstanceId).build();
79
-                standardCostService.iAppSceneCostResultValueService.save(appSceneCostResultValue);
80
-            }
81
-        } catch (Exception e) {
82
-            throw new RuntimeException(e);
83
-        }
84
-    }
85
-
86
-    /**
87
-     * 物料成本任务
88
-     */
89
-    public static void materialCostTask(TaskExecutionContext parameters) {
90
-        //1.查询出物料编号对应的下所有的BOM信息
91
-        //2.计算出所有的单个物料的物料成本
92
-        //2.1查询出物料的单价和采购数量
93
-        //2.2计算出物料成本并存储到成本结果数据表中
94
-    }
95
-
96
-    /**
97
-     * 人工成本任务
98
-     */
99
-    public static void laborCostTask(TaskExecutionContext parameters) {
100
-        try {
101
-            //获取最上层的物料号
102
-            String topMaterialCode = "";
103
-            //获取任务类型
104
-            String taskType = "";
105
-            //获取上一节点任务类型
106
-            String lastTaskType = "LaborCost";
107
-            //获取任务代码
108
-            String taskCode = "";
109
-            //获取流程id
110
-            String flowInstanceId = "1";
111
-            //人工费率
112
-            BigDecimal laborRate = new BigDecimal("0.0");
113
-            //1.查询出物料编号对应的下所有的BOM信息
114
-            List<AppSceneCostResultValue> list = standardCostService.iAppSceneCostResultValueService.getResultValueByTopMaterialNo(topMaterialCode, lastTaskType, flowInstanceId);
115
-            //2.计算出所有的单个物料的人工成本
116
-            //2.1查询出物料的人员工时和人工小时费率(涉及:小时费率表和工序表)
117
-            List<String> MarterialNoList = new ArrayList<>();
118
-            if (list != null && list.size() > 0) {
119
-                MarterialNoList = list.stream().filter(s -> s.getMarterialNo() != null).map(AppSceneCostResultValue::getMarterialNo).collect(Collectors.toList());
120
-            }
121
-            //查询工序工时
122
-            Map<String, List<CostMaterialProcessHours>> processHoursMap = standardCostService.costMaterialProcessHoursService.getProcessHoursByMaterialNo(MarterialNoList);
123
-            for (int i = 0; i < list.size(); i++) {
124
-                AppSceneCostResultValue appSceneCostResultValue = list.get(i);
125
-                String marterialNo = appSceneCostResultValue.getMarterialNo();
126
-                if (marterialNo != null) {
127
-                    BigDecimal totalLaborCost = new BigDecimal("0.0");
128
-                    List<CostMaterialProcessHours> costMaterialProcessHours = processHoursMap.get(marterialNo);
129
-                    if (costMaterialProcessHours != null && costMaterialProcessHours.size() > 0) {
130
-                        for (int j = 0; j < costMaterialProcessHours.size(); j++) {
131
-                            CostMaterialProcessHours processHours = costMaterialProcessHours.get(j);
132
-                            BigDecimal laborHours = processHours.getLaborHours();
133
-                            //计算总人工成本
134
-                            totalLaborCost.add(laborHours.multiply(laborRate));
135
-                        }
136
-                    }
137
-                    //2.2计算出人工成本并存储到成本结果数据表中
138
-                    AppSceneCostResultValue resultValue = AppSceneCostResultValue.builder().belongTopMaterialNo(topMaterialCode).marterialNo(marterialNo).parentMarterialNo(appSceneCostResultValue.getParentMarterialNo()).taskType(taskType).taskCode(taskCode).flowInstanceId(flowInstanceId).countValue(totalLaborCost + "").build();
139
-                    standardCostService.iAppSceneCostResultValueService.save(resultValue);
140
-                }
141
-            }
142
-        } catch (Exception e) {
143
-            throw new RuntimeException(e);
144
-        }
145
-
146
-    }
147
-
148
-    /**
149
-     * 制造费用成本任务
150
-     */
151
-    public static void manufacturingCostTask(TaskExecutionContext parameters) {
152
-        //1.查询出物料编号对应的下所有的BOM信息
153
-        //2.根据费用类型进行不同的费用计算
154
-        //2.1机器折旧费(机器工时*费率)
155
-        //2.2机物料消耗费(辅料工时*费率)
156
-        //2.3水电费(燃动力工时*费率)
157
-        //2.4其他制费(其他工时*费率)
158
-        //2.5物流费((机器折旧+机物料消耗+水电费+其他制费)*10.16%)
159
-    }
160
-
161
-    /**
162
-     * 标准成本计算任务
163
-     */
164
-    public static void standardCostTask(TaskExecutionContext parameters) {
165
-        //1.查询出物料编号对应的下所有的BOM信息
166
-        //2.计算出所有的单个物料的本阶的标准成本(标准成本=物料成本+人工成本+制造费用)
167
-        //3.计算出所有的单个物料的累计标准成本
168
-    }
169
-}

+ 1
- 4
qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/plugin/standardcost/StandardCostTask.java 查看文件

17
 
17
 
18
 package com.zzsmart.qomo.kn.cost.manage.plugin.standardcost;
18
 package com.zzsmart.qomo.kn.cost.manage.plugin.standardcost;
19
 
19
 
20
-import com.zzsmart.qomo.kn.cost.manage.mapper.CostMaterialBomMapper;
21
-import com.zzsmart.qomo.kn.cost.manage.plugin.materialinput.StandardCostService;
22
-import com.zzsmart.qomo.kn.cost.manage.service.IAppSceneCostResultValueService;
20
+import com.zzsmart.qomo.kn.cost.manage.plugin.StandardCostService;
23
 import com.zzsmart.qomo.plugin.task.api.*;
21
 import com.zzsmart.qomo.plugin.task.api.*;
24
 import com.zzsmart.qomo.plugin.task.api.parameters.AbstractParameters;
22
 import com.zzsmart.qomo.plugin.task.api.parameters.AbstractParameters;
25
-import org.springframework.beans.factory.annotation.Autowired;
26
 
23
 
27
 /**
24
 /**
28
  * 标准成本计算任务
25
  * 标准成本计算任务

+ 9
- 1
qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/CostPurchasePriceService.java 查看文件

1
 package com.zzsmart.qomo.kn.cost.manage.service;
1
 package com.zzsmart.qomo.kn.cost.manage.service;
2
 
2
 
3
+import com.zzsmart.qomo.kn.cost.manage.entity.CostMaterialProcessHours;
3
 import com.zzsmart.qomo.kn.cost.manage.entity.CostPurchasePrice;
4
 import com.zzsmart.qomo.kn.cost.manage.entity.CostPurchasePrice;
4
 import com.baomidou.mybatisplus.extension.service.IService;
5
 import com.baomidou.mybatisplus.extension.service.IService;
5
 
6
 
7
+import java.math.BigDecimal;
8
+import java.util.List;
9
+import java.util.Map;
10
+
6
 /**
11
 /**
7
  * <p>
12
  * <p>
8
  * 物料采购单价 服务类
13
  * 物料采购单价 服务类
12
  * @since 2024-06-19
17
  * @since 2024-06-19
13
  */
18
  */
14
 public interface CostPurchasePriceService extends IService<CostPurchasePrice> {
19
 public interface CostPurchasePriceService extends IService<CostPurchasePrice> {
15
-
20
+    /**
21
+     * 查询满足物料编号的最低采购价
22
+     */
23
+    Map<String, BigDecimal> getMinCostPurchasePriceByMaterialNo(List<String> materialNos);
16
 }
24
 }

+ 1
- 1
qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/IAppSceneCostResultValueService.java 查看文件

17
      * @param topMaterialCode
17
      * @param topMaterialCode
18
      * @return
18
      * @return
19
      */
19
      */
20
-    List<AppSceneCostResultValue> getResultValueByTopMaterialNo(String topMaterialCode,String lastTaskType,String flowInstanceId);
20
+    List<AppSceneCostResultValue> getResultValueByTopMaterialNo(String topMaterialCode,String taskType,String flowInstanceId);
21
 }
21
 }

+ 3
- 0
qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/impl/AppSceneCostResultValueServiceImpl.java 查看文件

39
         if (topMaterialCode != null && !topMaterialCode.equals("") && lastTaskType != null && !lastTaskType.equals("") && flowInstanceId != null && !flowInstanceId.equals("")) {
39
         if (topMaterialCode != null && !topMaterialCode.equals("") && lastTaskType != null && !lastTaskType.equals("") && flowInstanceId != null && !flowInstanceId.equals("")) {
40
             queryWrapper.eq("belong_top_material_no", topMaterialCode).eq("task_type", lastTaskType).eq("flow_instance_id", flowInstanceId);
40
             queryWrapper.eq("belong_top_material_no", topMaterialCode).eq("task_type", lastTaskType).eq("flow_instance_id", flowInstanceId);
41
             result = appSceneCostResultValueMapper.selectList(queryWrapper);
41
             result = appSceneCostResultValueMapper.selectList(queryWrapper);
42
+        } else if (topMaterialCode != null && !topMaterialCode.equals("") && flowInstanceId != null && !flowInstanceId.equals("")) {
43
+            queryWrapper.eq("belong_top_material_no", topMaterialCode).eq("task_type", lastTaskType).eq("flow_instance_id", flowInstanceId);
44
+            result = appSceneCostResultValueMapper.selectList(queryWrapper);
42
         }
45
         }
43
         return result;
46
         return result;
44
     }
47
     }

+ 32
- 1
qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/impl/CostPurchasePriceServiceImpl.java 查看文件

1
 package com.zzsmart.qomo.kn.cost.manage.service.impl;
1
 package com.zzsmart.qomo.kn.cost.manage.service.impl;
2
 
2
 
3
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
4
+import com.zzsmart.qomo.kn.cost.manage.entity.CostMaterialProcessHours;
3
 import com.zzsmart.qomo.kn.cost.manage.entity.CostPurchasePrice;
5
 import com.zzsmart.qomo.kn.cost.manage.entity.CostPurchasePrice;
4
 import com.zzsmart.qomo.kn.cost.manage.mapper.CostPurchasePriceMapper;
6
 import com.zzsmart.qomo.kn.cost.manage.mapper.CostPurchasePriceMapper;
5
 import com.zzsmart.qomo.kn.cost.manage.service.CostPurchasePriceService;
7
 import com.zzsmart.qomo.kn.cost.manage.service.CostPurchasePriceService;
6
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
8
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
9
+import org.checkerframework.checker.units.qual.A;
10
+import org.springframework.beans.factory.annotation.Autowired;
7
 import org.springframework.stereotype.Service;
11
 import org.springframework.stereotype.Service;
8
 
12
 
13
+import java.math.BigDecimal;
14
+import java.util.ArrayList;
15
+import java.util.HashMap;
16
+import java.util.List;
17
+import java.util.Map;
18
+
9
 /**
19
 /**
10
  * <p>
20
  * <p>
11
  * 物料采购单价 服务实现类
21
  * 物料采购单价 服务实现类
12
  * </p>
22
  * </p>
13
  *
23
  *
14
- * @author  
24
+ * @author
15
  * @since 2024-06-19
25
  * @since 2024-06-19
16
  */
26
  */
17
 @Service
27
 @Service
18
 public class CostPurchasePriceServiceImpl extends ServiceImpl<CostPurchasePriceMapper, CostPurchasePrice> implements CostPurchasePriceService {
28
 public class CostPurchasePriceServiceImpl extends ServiceImpl<CostPurchasePriceMapper, CostPurchasePrice> implements CostPurchasePriceService {
29
+    @Autowired
30
+    CostPurchasePriceMapper costPurchasePriceMapper;
19
 
31
 
32
+    /**
33
+     * 查询满足物料编号的最低采购价
34
+     *
35
+     * @param materialNos
36
+     */
37
+    @Override
38
+    public Map<String, BigDecimal> getMinCostPurchasePriceByMaterialNo(List<String> materialNos) {
39
+        Map<String, BigDecimal> map = new HashMap<>();
40
+        QueryWrapper<CostPurchasePrice> queryWrapper = new QueryWrapper();
41
+        if (materialNos != null && materialNos.size() > 0) {
42
+            queryWrapper.in("material_code", materialNos);
43
+            List<CostPurchasePrice> costPurchasePrices = costPurchasePriceMapper.selectList(queryWrapper);
44
+            for (int i = 0; i < costPurchasePrices.size(); i++) {
45
+                CostPurchasePrice costPurchasePrice = costPurchasePrices.get(i);
46
+                map.put(costPurchasePrice.getMaterialCode(), costPurchasePrice.getMinPurchasePrice());
47
+            }
48
+        }
49
+        return map;
50
+    }
20
 }
51
 }

+ 37
- 0
qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/vo/FlowTaskInfoVO.java 查看文件

1
+package com.zzsmart.qomo.kn.cost.manage.vo;
2
+
3
+import lombok.AllArgsConstructor;
4
+import lombok.Builder;
5
+import lombok.Data;
6
+import lombok.NoArgsConstructor;
7
+
8
+@Data
9
+@Builder
10
+@NoArgsConstructor
11
+@AllArgsConstructor
12
+public class FlowTaskInfoVO {
13
+    /**
14
+     * 最顶层物料编号
15
+     */
16
+    private String topMaterialCode;
17
+    /**
18
+     * 获取任务类型
19
+     */
20
+    private String taskType;
21
+    /**
22
+     * 获取任务代码
23
+     */
24
+    private String taskCode;
25
+    /**
26
+     * 获取流程id
27
+     */
28
+    private String flowInstanceId;
29
+    /**
30
+     * SQL查询语句
31
+     */
32
+    private String sqlString;
33
+    /**
34
+     * 费用类别
35
+     */
36
+    private String feeType;
37
+}