|
@@ -17,7 +17,9 @@ import org.springframework.stereotype.Component;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
import java.util.Map;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
//流程监听,固资在转移、报废等操作时回写状态
|
|
|
@Component
|
|
@@ -38,46 +40,52 @@ public class ListenerMaterialApply implements TaskListener, ExecutionListener {
|
|
|
String eventName = delegateExecution.getEventName();
|
|
|
if ("start".equals(eventName)) {
|
|
|
// 流程开始
|
|
|
+ Map<String, Object> variables = delegateExecution.getVariables();
|
|
|
+ //子表List
|
|
|
+ List<Map<String, Object>> applyDetails = this.materialMapper.getApplyDetail(variables.get("tableId").toString());
|
|
|
+ //审批单据占用List
|
|
|
+ List<Map<String, Object>> occupancy = materialMapper.getOccupancy();
|
|
|
+ Map<String, BigDecimal> occupyDetails = occupancy.stream().collect(Collectors.toMap(key -> {
|
|
|
+ return key.get("materialName").toString();
|
|
|
+ }, val -> {
|
|
|
+ return new BigDecimal(val.get("amount").toString());
|
|
|
+ }));
|
|
|
+ //库存List
|
|
|
+ List<Material> inventory = this.materialMapper.selectList(new QueryWrapper<>());
|
|
|
+ Map<String, BigDecimal> inventoryDetails = inventory.stream().collect(Collectors.toMap(Material::getMaterialName,Material::getQuantity));
|
|
|
+
|
|
|
+ String msg = "";
|
|
|
+ for(Map<String,Object> detail : applyDetails){
|
|
|
+ String materialName = detail.get("materialName").toString();
|
|
|
+ BigDecimal amount = new BigDecimal(detail.get("amount").toString());
|
|
|
+ BigDecimal subtract = amount.add(occupyDetails.getOrDefault(materialName, BigDecimal.ZERO)).subtract(inventoryDetails.getOrDefault(materialName, BigDecimal.ZERO));
|
|
|
+ if (subtract.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
+ msg += materialName + " 现有库存:" + inventoryDetails.getOrDefault(materialName, BigDecimal.ZERO) + " 单据占用:" + occupyDetails.getOrDefault(materialName, BigDecimal.ZERO) + " 缺失:" + subtract +" ";
|
|
|
+ }
|
|
|
+ };
|
|
|
+ if (StringUtils.isNotBlank(msg)) {
|
|
|
+ throw new RuntimeException(msg);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
} else if ("end".equals(eventName)) {
|
|
|
- //todo
|
|
|
Map<String, Object> variables = delegateExecution.getVariables();
|
|
|
//子表List
|
|
|
- String sublist = String.valueOf(variables.get("sublist"));
|
|
|
+ List<Map<String, Object>> applyDetails = this.materialMapper.getApplyDetail(variables.get("tableId").toString());
|
|
|
|
|
|
+ for(Map<String,Object> detail : applyDetails){
|
|
|
+ String materialName = detail.get("materialName").toString();
|
|
|
+ BigDecimal amount = new BigDecimal(detail.get("amount").toString());
|
|
|
|
|
|
- if(StringUtils.isNotBlank(sublist)){
|
|
|
- //sublist格式
|
|
|
-// [{"material_name2":"物料名称1","amount":500,"unit":"计量单位1","notes3":"测试","key":1687761773306},
|
|
|
-// {"material_name2":"物料名称2","amount":50000,"unit":"计量单位2","notes3":"测试","key":1687761778679}]
|
|
|
- JSONArray ay= JSONArray.parseArray(sublist);
|
|
|
- for(int i=0;i<ay.size();i++) {
|
|
|
- //物料名称
|
|
|
- String materialName = (String) ay.getJSONObject(i).get("material_name2");
|
|
|
- //申请数量
|
|
|
- BigDecimal amount;
|
|
|
- Object amount1 = ay.getJSONObject(i).get("amount");
|
|
|
- if(amount1 instanceof Integer){
|
|
|
- amount = new BigDecimal((Integer) ay.getJSONObject(i).get("amount"));
|
|
|
- }else{
|
|
|
- amount = (BigDecimal) amount1;
|
|
|
- }
|
|
|
- //计量单位
|
|
|
- String unit = (String) ay.getJSONObject(i).get("unit");
|
|
|
- QueryWrapper<Material> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.eq("material_name",materialName);
|
|
|
- queryWrapper.eq("unit",unit);
|
|
|
- Material material = materialMapper.selectOne(queryWrapper);
|
|
|
- if(material==null){
|
|
|
- throw new Exception("物料名称为"+materialName+";计量单位为"+unit+"的物料不存在");
|
|
|
- }
|
|
|
- BigDecimal quantity = material.getQuantity();
|
|
|
- if(quantity.compareTo(amount)==-1){
|
|
|
- throw new Exception("物料名称为"+materialName+";计量单位为"+unit+"的物料库存数量小于申请数量!");
|
|
|
- }
|
|
|
- material.setQuantity(material.getQuantity().subtract(amount));
|
|
|
- materialMapper.updateById(material);
|
|
|
+ QueryWrapper<Material> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.eq("material_name",materialName);
|
|
|
+ Material material = materialMapper.selectOne(queryWrapper);
|
|
|
+ if(material==null){
|
|
|
+ throw new RuntimeException("物料名称为"+materialName+"的物料不存在");
|
|
|
}
|
|
|
- }
|
|
|
+ material.setQuantity(material.getQuantity().subtract(amount));
|
|
|
+ materialMapper.updateById(material);
|
|
|
+ };
|
|
|
} else if ("take".equals(eventName)) {
|
|
|
// 连线监听器
|
|
|
}
|