diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/em/wql/QEM_EQUIPMENTFILE01.wql b/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/em/wql/QEM_EQUIPMENTFILE01.wql index fc1dbf39..ab345cda 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/em/wql/QEM_EQUIPMENTFILE01.wql +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/em/wql/QEM_EQUIPMENTFILE01.wql @@ -25,6 +25,7 @@ 输入.workprocedure_id TYPEAS s_string 输入.is_produceuse TYPEAS s_string 输入.devicerecord_id TYPEAS s_string + 输入.device_level TYPEAS s_string 输入.classIds TYPEAS f_string 输入.deptIds TYPEAS f_string @@ -72,6 +73,9 @@ OPTION 输入.status <> "" equipmentfile.status = 输入.status ENDOPTION + OPTION 输入.device_level <> "" + equipmentfile.device_level = 输入.device_level + ENDOPTION OPTION 输入.use_deptid <> "" equipmentfile.use_deptid in 输入.deptIds ENDOPTION diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/em/wql/em.xls b/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/em/wql/em.xls index 968ce29d..90b011a6 100644 Binary files a/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/em/wql/em.xls and b/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/em/wql/em.xls differ diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/master/constant/MaterOptTypeEnum.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/master/constant/MaterOptTypeEnum.java index 3760cf34..58b3d448 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/master/constant/MaterOptTypeEnum.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/master/constant/MaterOptTypeEnum.java @@ -33,7 +33,8 @@ public enum MaterOptTypeEnum { SPARE(22, "23", "备品备件", "('1503644361789935616')", ""), SBGZ(23, "24", "设备故障", "('1541964046385942528')", ""), TJJ_AND_OTHER(24, "25", "添加剂和其他有色金属粉", "('1503644361697660928','1503644362838511616')", ""), - BJID(25, "26", "备品备件", "1503644361789935616", ""); + BJID(25, "26", "备品备件", "1503644361789935616", ""), + THW_AND_GF_AND_TJJ(26, "27", "碳化钨、钴粉、添加剂", "('1503644361664106496','1503644362192588800','1503644361697660928')", ""); diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/pdm/rest/WastecchangeController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/pdm/rest/WastecchangeController.java new file mode 100644 index 00000000..bc0f3e98 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/pdm/rest/WastecchangeController.java @@ -0,0 +1,78 @@ + +package org.nl.wms.basedata.pdm.rest; + + +import com.alibaba.fastjson.JSONObject; +import oracle.ucp.proxy.annotation.Post; +import org.nl.wms.basedata.pdm.service.WastecchangeService; +import org.nl.wms.basedata.pdm.service.dto.WastecchangeDto; +import org.springframework.data.domain.Pageable; +import lombok.RequiredArgsConstructor; +import org.nl.annotation.Log; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.*; + +import java.util.Map; + +import lombok.extern.slf4j.Slf4j; + +/** + * @author liuxy + * @date 2022-10-13 + **/ +@RestController +@RequiredArgsConstructor +@Api(tags = "软废碳平衡修正维护管理") +@RequestMapping("/api/wastecchange") +@Slf4j +public class WastecchangeController { + + private final WastecchangeService wastecchangeService; + + @GetMapping + @Log("查询软废碳平衡修正维护") + @ApiOperation("查询软废碳平衡修正维护") + //@PreAuthorize("@el.check('wastecchange:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(wastecchangeService.queryAll(whereJson, page), HttpStatus.OK); + } + + @PostMapping + @Log("新增软废碳平衡修正维护") + @ApiOperation("新增软废碳平衡修正维护") + //@PreAuthorize("@el.check('wastecchange:add')") + public ResponseEntity create(@Validated @RequestBody WastecchangeDto dto) { + wastecchangeService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改软废碳平衡修正维护") + @ApiOperation("修改软废碳平衡修正维护") + //@PreAuthorize("@el.check('wastecchange:edit')") + public ResponseEntity update(@Validated @RequestBody WastecchangeDto dto) { + wastecchangeService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除软废碳平衡修正维护") + @ApiOperation("删除软废碳平衡修正维护") + //@PreAuthorize("@el.check('wastecchange:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + wastecchangeService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @Log("确认") + @ApiOperation("确认") + @PostMapping("/confirm") + public ResponseEntity confirm(@RequestBody JSONObject whereJson) { + wastecchangeService.confirm(whereJson); + return new ResponseEntity<>(HttpStatus.OK); + } +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/pdm/service/WastecchangeService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/pdm/service/WastecchangeService.java new file mode 100644 index 00000000..c9643a01 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/pdm/service/WastecchangeService.java @@ -0,0 +1,81 @@ + +package org.nl.wms.basedata.pdm.service; + +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.basedata.pdm.service.dto.WastecchangeDto; +import org.springframework.data.domain.Pageable; + +import java.util.Map; +import java.util.List; +import java.io.IOException; +import javax.servlet.http.HttpServletResponse; + +/** + * @author liuxy + * @description 服务接口 + * @date 2022-10-13 + **/ +public interface WastecchangeService { + + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * + * @param change_id ID + * @return Wastecchange + */ + WastecchangeDto findById(Long change_id); + + /** + * 根据编码查询 + * + * @param code code + * @return Wastecchange + */ + WastecchangeDto findByCode(String code); + + + /** + * 创建 + * + * @param dto / + */ + void create(WastecchangeDto dto); + + /** + * 编辑 + * + * @param dto / + */ + void update(WastecchangeDto dto); + + /** + * 多选删除 + * + * @param ids / + */ + void deleteAll(Long[] ids); + + /** + * 确认 + * + * @param whereJson / + */ + void confirm(JSONObject whereJson); +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/pdm/service/dto/WastecchangeDto.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/pdm/service/dto/WastecchangeDto.java new file mode 100644 index 00000000..b5f10335 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/pdm/service/dto/WastecchangeDto.java @@ -0,0 +1,84 @@ +package org.nl.wms.basedata.pdm.service.dto; + +import lombok.Data; + import java.math.BigDecimal; +import java.io.Serializable; + import com.fasterxml.jackson.databind.annotation.JsonSerialize; + import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; + +/** +* @description / +* @author liuxy +* @date 2022-10-13 +**/ +@Data +public class WastecchangeDto implements Serializable { + + /** 记录标识 */ + /** 防止精度丢失 */ + @JsonSerialize(using= ToStringSerializer.class) + private Long change_id; + + /** 物料标识 */ + private Long material_id; + + /** 工艺类型 */ + private String tech_type; + + /** CF */ + private BigDecimal cf_qty; + + /** YZ */ + private BigDecimal yz_qty; + + /** CX */ + private BigDecimal cx_qty; + + /** YC */ + private BigDecimal yc_qty; + + /** JY */ + private BigDecimal jy_qty; + + /** LT */ + private BigDecimal lt_qty; + + /** SJ */ + private BigDecimal sj_qty; + + /** YS */ + private BigDecimal ys_qty; + + /** DS */ + private BigDecimal ds_qty; + + /** CQX */ + private BigDecimal cqx_qty; + + /** XQX */ + private BigDecimal xqx_qty; + + /** QX */ + private BigDecimal qx_qty; + + /** JCF */ + private BigDecimal jcf_qty; + + /** TB */ + private BigDecimal tb_qty; + + /** YCR */ + private BigDecimal ycr_qty; + + /** GZ */ + private BigDecimal gz_qty; + + /** 创建人 */ + private Long create_id; + + /** 创建人姓名 */ + private String create_name; + + /** 创建时间 */ + private String create_time; +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/pdm/service/impl/WastecchangeServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/pdm/service/impl/WastecchangeServiceImpl.java new file mode 100644 index 00000000..9c596569 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/pdm/service/impl/WastecchangeServiceImpl.java @@ -0,0 +1,387 @@ + +package org.nl.wms.basedata.pdm.service.impl; + + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import lombok.RequiredArgsConstructor; +import org.apache.poi.util.StringUtil; +import org.nl.exception.BadRequestException; +import org.nl.wms.basedata.master.constant.MaterOptTypeEnum; +import org.nl.wms.basedata.pdm.service.WastecchangeService; +import org.nl.wms.basedata.pdm.service.dto.WastecchangeDto; +import org.nl.wql.WQL; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import org.springframework.data.domain.Pageable; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.utils.SecurityUtils; +import org.nl.wql.core.bean.ResultBean; +import org.nl.wql.core.bean.WQLObject; +import org.nl.wql.util.WqlUtil; +import lombok.extern.slf4j.Slf4j; +import cn.hutool.core.util.ObjectUtil; + +/** + * @author liuxy + * @description 服务实现 + * @date 2022-10-13 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class WastecchangeServiceImpl implements WastecchangeService { + + @Override + public Map queryAll(Map whereJson, Pageable page) { + String material_code = MapUtil.getStr(whereJson, "material_code"); + + HashMap map = new HashMap<>(); + map.put("flag", "1"); + if (ObjectUtil.isNotEmpty(material_code)) map.put("material_code", "%" + material_code + "%"); + map.put("class_ids", MaterOptTypeEnum.THW.getClass_idStr()); + + JSONObject json = WQL.getWO("PDM_WASTECCHANGE").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "mater.material_code ASC"); + + return json; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_wastecchange"); + JSONArray arr = wo.query().getResultJSONArray(0); + if (ObjectUtil.isNotEmpty(arr)) return arr.toJavaList(WastecchangeDto.class); + return null; + } + + @Override + public WastecchangeDto findById(Long change_id) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_wastecchange"); + JSONObject json = wo.query("change_id = '" + change_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(WastecchangeDto.class); + } + return null; + } + + @Override + public WastecchangeDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_wastecchange"); + JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(WastecchangeDto.class); + } + return null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(WastecchangeDto dto) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getNickName(); + String now = DateUtil.now(); + + dto.setChange_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setCreate_id(currentUserId); + dto.setCreate_name(nickName); + dto.setCreate_time(now); + + WQLObject wo = WQLObject.getWQLObject("pdm_bi_wastecchange"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(WastecchangeDto dto) { + WastecchangeDto entity = this.findById(dto.getChange_id()); + if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getNickName(); + + String now = DateUtil.now(); + + WQLObject wo = WQLObject.getWQLObject("pdm_bi_wastecchange"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getNickName(); + String now = DateUtil.now(); + + WQLObject wo = WQLObject.getWQLObject("pdm_bi_wastecchange"); + for (Long change_id : ids) { + JSONObject param = new JSONObject(); + param.put("change_id", String.valueOf(change_id)); + param.put("is_delete", "1"); + param.put("update_optid", currentUserId); + param.put("update_optname", nickName); + param.put("update_time", now); + wo.update(param); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void confirm(JSONObject whereJson) { + /* + * 修改软废碳平衡 + * 1找软废:软废类型为:负压脱蜡 则根据条件: + * a.粉料牌号包含 "新"、 软废编码包含软废类型后缀 例如:软废编码 like "-F"、 未删除且启用 + * b.查询此软废的产品bom表的明细中是否包含此碳化钨 + * 2.找软废对应的PG粉 + * a.软废编码去掉 "-CF" + * 3.修改软废碳平衡: + * a.软废碳平衡=PG粉碳平衡+CF软废修正值 + * 4.若工艺为氢气脱蜡:软废粉料牌号为不包含"新",其它都一样 + */ + WQLObject materTab = WQLObject.getWQLObject("md_me_materialbase"); + WQLObject extTab = WQLObject.getWQLObject("MD_ME_ProducMaterialExt"); + WQLObject wasTab = WQLObject.getWQLObject("PDM_BI_WasteCChange"); + + // 1.将16中软废类型 放到一个数组当中 + JSONArray rf_arr = this.contentShift(whereJson); + // 2.找软废 + String tech_type = whereJson.getString("tech_type"); + + for (int i = 0; i < rf_arr.size(); i++) { + JSONObject json_rf_type = rf_arr.getJSONObject(i); + HashMap map = new HashMap<>(); + map.put("flag", "2"); + map.put("material_id", whereJson.getString("material_id")); + map.put("code", "%-" + json_rf_type.getString("name")); + + JSONArray jsonRfArr = new JSONArray(); + + if (StrUtil.equals(tech_type, "01")) { + // 负压脱蜡 + jsonRfArr = WQL.getWO("PDM_WASTECCHANGE").addParamMap(map).process().getResultJSONArray(0); + } else { + // 氢气脱蜡 + map.put("flag", "3"); + jsonRfArr = WQL.getWO("PDM_WASTECCHANGE").addParamMap(map).process().getResultJSONArray(0); + } + + // 根据软废找到PG粉 + for (int j = 0; j < jsonRfArr.size(); j++) { + JSONObject json = jsonRfArr.getJSONObject(j); + String materiai_code = json.getString("material_code"); + String pg_code = materiai_code.substring(0, materiai_code.indexOf("-" + json_rf_type.getString("name"))); + + JSONObject jsonMater_cp = materTab.query("material_code = '" + pg_code + "'").uniqueResult(0); + JSONObject jsonExt_cp = extTab.query("material_id = '" + jsonMater_cp.getString("material_id") + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonExt_cp)) throw new BadRequestException("PG粉扩展属性不存在" + pg_code); + + // 修改软废碳平衡:软废碳平衡=PG粉碳平衡+CF软废修正值 + double rf_c_balance = NumberUtil.add(jsonExt_cp.getDoubleValue("c_balance"), json_rf_type.getDoubleValue("value")); + + JSONObject jsonExt_rf = extTab.query("material_id = '" + json.getString("material_id") + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonExt_rf)) + throw new BadRequestException("软废扩展属性不存在" + jsonExt_rf.getString("material_code")); + jsonExt_rf.put("c_balance", rf_c_balance); + extTab.update(jsonExt_rf); + } + } + // 3.插入软废碳平衡修正表 + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getNickName(); + + // 先删除在插入 + JSONObject jsonObject = wasTab.query("material_id = '" + whereJson.getString("material_id") + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonObject)) wasTab.delete("material_id = '"+whereJson.getString("material_id")+"'"); + + JSONObject jsonWas = new JSONObject(); + jsonWas.put("change_id", IdUtil.getSnowflake(1,1).nextId()); + jsonWas.put("material_id", whereJson.getString("material_id")); + jsonWas.put("tech_type", whereJson.getString("tech_type")); + jsonWas.put("cf_qty", whereJson.getDoubleValue("cf_qty")); + jsonWas.put("yz_qty", whereJson.getDoubleValue("yz_qty")); + jsonWas.put("cx_qty", whereJson.getDoubleValue("cx_qty")); + jsonWas.put("yc_qty", whereJson.getDoubleValue("yc_qty")); + jsonWas.put("jy_qty", whereJson.getDoubleValue("jy_qty")); + jsonWas.put("lt_qty", whereJson.getDoubleValue("lt_qty")); + jsonWas.put("sj_qty", whereJson.getDoubleValue("sj_qty")); + jsonWas.put("ys_qty", whereJson.getDoubleValue("ys_qty")); + jsonWas.put("ds_qty", whereJson.getDoubleValue("ds_qty")); + jsonWas.put("cqx_qty", whereJson.getDoubleValue("cqx_qty")); + jsonWas.put("xqx_qty", whereJson.getDoubleValue("xqx_qty")); + jsonWas.put("qx_qty", whereJson.getDoubleValue("qx_qty")); + jsonWas.put("jcf_qty", whereJson.getDoubleValue("jcf_qty")); + jsonWas.put("tb_qty", whereJson.getDoubleValue("tb_qty")); + jsonWas.put("ycr_qty", whereJson.getDoubleValue("ycr_qty")); + jsonWas.put("gz_qty", whereJson.getDoubleValue("gz_qty")); + jsonWas.put("create_id", currentUserId); + jsonWas.put("create_name", nickName); + jsonWas.put("create_time", DateUtil.now()); + wasTab.insert(jsonWas); + + } + + @Transactional(rollbackFor = Exception.class) + public JSONArray contentShift(JSONObject json) { + JSONArray array = new JSONArray(); + + JSONObject json_CF = new JSONObject(); + json_CF.put("name", "CF"); + if (ObjectUtil.isEmpty(json.getString("cf_qty"))) { + json_CF.put("value", "0"); + } else { + json_CF.put("value", json.getString("cf_qty")); + } + array.add(json_CF); + + JSONObject json_YZ = new JSONObject(); + json_YZ.put("name", "YZ"); + if (ObjectUtil.isEmpty(json.getString("yz_qty"))) { + json_YZ.put("value", "0"); + } else { + json_YZ.put("value", json.getString("yz_qty")); + } + array.add(json_YZ); + + JSONObject json_CX = new JSONObject(); + json_CX.put("name", "CX"); + if (ObjectUtil.isEmpty(json.getString("cx_qty"))) { + json_CX.put("value", "0"); + } else { + json_CX.put("value", json.getString("cx_qty")); + } + array.add(json_CX); + + JSONObject json_YC = new JSONObject(); + json_YC.put("name", "YC"); + if (ObjectUtil.isEmpty(json.getString("yc_qty"))) { + json_YC.put("value", "0"); + } else { + json_YC.put("value", json.getString("yc_qty")); + } + array.add(json_YC); + + JSONObject json_JY = new JSONObject(); + json_JY.put("name", "JY"); + if (ObjectUtil.isEmpty(json.getString("jy_qty"))) { + json_JY.put("value", "0"); + } else { + json_JY.put("value", json.getString("jy_qty")); + } + array.add(json_JY); + + JSONObject json_LT = new JSONObject(); + json_LT.put("name", "LT"); + if (ObjectUtil.isEmpty(json.getString("lt_qty"))) { + json_LT.put("value", "0"); + } else { + json_LT.put("value", json.getString("lt_qty")); + } + array.add(json_LT); + + JSONObject json_SJ = new JSONObject(); + json_SJ.put("name", "SJ"); + if (ObjectUtil.isEmpty(json.getString("sj_qty"))) { + json_SJ.put("value", "0"); + } else { + json_SJ.put("value", json.getString("sj_qty")); + } + array.add(json_SJ); + + JSONObject json_YS = new JSONObject(); + json_YS.put("name", "YS"); + if (ObjectUtil.isEmpty(json.getString("ys_qty"))) { + json_YS.put("value", "0"); + } else { + json_YS.put("value", json.getString("ys_qty")); + } + array.add(json_YS); + + JSONObject json_DS = new JSONObject(); + json_DS.put("name", "DS"); + if (ObjectUtil.isEmpty(json.getString("ds_qty"))) { + json_DS.put("value", "0"); + } else { + json_DS.put("value", json.getString("ds_qty")); + } + array.add(json_DS); + + JSONObject json_CQX = new JSONObject(); + json_CQX.put("name", "CQX"); + if (ObjectUtil.isEmpty(json.getString("cqx_qty"))) { + json_CQX.put("value", "0"); + } else { + json_CQX.put("value", json.getString("cqx_qty")); + } + array.add(json_CQX); + + JSONObject json_XQX = new JSONObject(); + json_XQX.put("name", "XQX"); + if (ObjectUtil.isEmpty(json.getString("xqx_qty"))) { + json_XQX.put("value", "0"); + } else { + json_XQX.put("value", json.getString("xqx_qty")); + } + array.add(json_XQX); + + JSONObject json_QX = new JSONObject(); + json_QX.put("name", "QX"); + if (ObjectUtil.isEmpty(json.getString("qx_qty"))) { + json_QX.put("value", "0"); + } else { + json_QX.put("value", json.getString("qx_qty")); + } + array.add(json_QX); + + JSONObject json_JCF = new JSONObject(); + json_JCF.put("name", "JCF"); + if (ObjectUtil.isEmpty(json.getString("jcf_qty"))) { + json_JCF.put("value", "0"); + } else { + json_JCF.put("value", json.getString("jcf_qty")); + } + array.add(json_JCF); + + JSONObject json_TB = new JSONObject(); + json_TB.put("name", "TB"); + if (ObjectUtil.isEmpty(json.getString("tb_qty"))) { + json_TB.put("value", "0"); + } else { + json_TB.put("value", json.getString("tb_qty")); + } + array.add(json_TB); + + JSONObject json_YCR = new JSONObject(); + json_YCR.put("name", "YCR"); + if (ObjectUtil.isEmpty(json.getString("ycr_qty"))) { + json_YCR.put("value", "0"); + } else { + json_YCR.put("value", json.getString("ycr_qty")); + } + array.add(json_YCR); + + JSONObject json_GZ = new JSONObject(); + json_GZ.put("name", "GZ"); + if (ObjectUtil.isEmpty(json.getString("gz_qty"))) { + json_GZ.put("value", "0"); + } else { + json_GZ.put("value", json.getString("gz_qty")); + } + array.add(json_GZ); + + return array; + } + +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/pdm/wal/PDM_WASTECCHANGE.wql b/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/pdm/wal/PDM_WASTECCHANGE.wql new file mode 100644 index 00000000..6781c425 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/pdm/wal/PDM_WASTECCHANGE.wql @@ -0,0 +1,159 @@ +[交易说明] + 交易名: 软废碳平衡修正维护分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.material_code TYPEAS s_string + 输入.class_ids TYPEAS f_string + 输入.material_id TYPEAS s_string + 输入.code TYPEAS s_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + mater.material_code, + mater.material_id, + mater.material_name, + mater.material_model, + chan.change_id, + chan.tech_type, + chan.cf_qty, + chan.yz_qty, + chan.cx_qty, + chan.yc_qty, + chan.jy_qty, + chan.lt_qty, + chan.sj_qty, + chan.ys_qty, + chan.ds_qty, + chan.cqx_qty, + chan.xqx_qty, + chan.qx_qty, + chan.jcf_qty, + chan.tb_qty, + chan.ycr_qty, + chan.gz_qty, + chan.create_id, + chan.create_name, + chan.create_time + FROM + md_me_materialbase mater + LEFT JOIN PDM_BI_WasteCChange chan ON mater.material_id = chan.material_id + WHERE + mater.is_delete = '0' + AND mater.is_used = '1' + + OPTION 输入.class_ids <> "" + mater.material_type_id = 输入.class_ids + ENDOPTION + + OPTION 输入.material_code <> "" + (mater.material_code like 输入.material_code or + mater.material_name like 输入.material_code) + ENDOPTION + + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + mater.*, + ext.old_mark + FROM + ( + SELECT + b.bom_id, + a.bom_code, + a.material_code, + a.material_id + FROM + MD_PD_ProductBOMDtl b + LEFT JOIN MD_PD_ProductBOM a ON a.bom_id = b.bom_id + WHERE + a.is_used = "1" + AND a.is_delete = '0' + AND b.material_id = 输入.material_id + GROUP BY b.bom_id + ) AS bomDtl + LEFT JOIN md_me_materialbase mater on mater.material_id = bomDtl.material_id + LEFT JOIN MD_ME_ProducMaterialExt ext ON mater.material_id = ext.material_id + + WHERE + mater.is_delete = '0' + AND mater.is_used = '1' + AND ext.old_mark like "%新%" + AND mater.material_code like 输入.code + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "3" + QUERY + SELECT + mater.*, + ext.old_mark + FROM + ( + SELECT + b.bom_id, + a.bom_code, + a.material_code, + a.material_id + FROM + MD_PD_ProductBOMDtl b + LEFT JOIN MD_PD_ProductBOM a ON a.bom_id = b.bom_id + WHERE + a.is_used = "1" + AND a.is_delete = '0' + AND b.material_id = 输入.material_id + GROUP BY b.bom_id + ) AS bomDtl + LEFT JOIN md_me_materialbase mater on mater.material_id = bomDtl.material_id + LEFT JOIN MD_ME_ProducMaterialExt ext ON mater.material_id = ext.material_id + + WHERE + mater.is_delete = '0' + AND mater.is_used = '1' + AND ext.old_mark not like "%新%" + AND mater.material_code like 输入.code + + ENDSELECT + ENDQUERY + ENDIF \ No newline at end of file diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pdm/wql/QPDM_WORKORDER01.wql b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pdm/wql/QPDM_WORKORDER01.wql index 86b695d0..d49992d8 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pdm/wql/QPDM_WORKORDER01.wql +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pdm/wql/QPDM_WORKORDER01.wql @@ -77,6 +77,9 @@ (device.device_code like 输入.device_code or device.device_name like 输入.device_code) ENDOPTION + OPTION 输入.device_id <> "" + device.device_id = 输入.device_id + ENDOPTION OPTION 输入.pcsn <> "" WorkOrder.pcsn like 输入.pcsn ENDOPTION diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pdm/wql/pdm.xls b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pdm/wql/pdm.xls index ffbca44b..d3310338 100644 Binary files a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pdm/wql/pdm.xls and b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pdm/wql/pdm.xls differ diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/rest/AcceptFormulaController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/rest/AcceptFormulaController.java index 8b9b2805..6c62803e 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/rest/AcceptFormulaController.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/rest/AcceptFormulaController.java @@ -15,6 +15,8 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.Map; /** @@ -117,4 +119,12 @@ public class AcceptFormulaController { public ResponseEntity autoCalculation(@RequestParam Map whereJson) { return new ResponseEntity<>(acceptFormulaService.autoCalculation(whereJson),HttpStatus.OK); } + + @Log("打印excel") + @ApiOperation("打印excel") + @GetMapping(value = "/print") + public ResponseEntity preview(HttpServletResponse response, @RequestParam Map whereJson) throws IOException { + acceptFormulaService.preview(response,whereJson); + return new ResponseEntity<>(HttpStatus.OK); + } } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/service/AcceptFormulaService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/service/AcceptFormulaService.java index 33929ed4..d7e07ccb 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/service/AcceptFormulaService.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/service/AcceptFormulaService.java @@ -6,6 +6,8 @@ import com.alibaba.fastjson.JSONObject; import org.nl.wms.pf.service.dto.ProductbomDto; import org.springframework.data.domain.Pageable; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.List; import java.util.Map; @@ -103,4 +105,7 @@ public interface AcceptFormulaService { * 提交 */ JSONArray autoCalculation(Map whereJson); + + void preview(HttpServletResponse response, Map whereJson) throws IOException; + } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/service/impl/AcceptFormulaServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/service/impl/AcceptFormulaServiceImpl.java index a278c423..e8bb7440 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/service/impl/AcceptFormulaServiceImpl.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/service/impl/AcceptFormulaServiceImpl.java @@ -3,23 +3,32 @@ package org.nl.wms.pf.service.impl; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.fill.FillWrapper; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.spire.xls.Workbook; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.exception.BadRequestException; import org.nl.modules.security.service.dto.JwtUserDto; +import org.nl.modules.system.service.impl.ParamServiceImpl; import org.nl.modules.system.util.CodeUtil; import org.nl.utils.SecurityUtils; +import org.nl.utils.SpringContextHolder; import org.nl.wms.basedata.master.constant.MaterOptTypeEnum; import org.nl.wms.pf.service.AcceptFormulaService; import org.nl.wms.pf.service.AcceptMarkService; import org.nl.wms.pf.service.dto.ProductbomDto; +import org.nl.wms.test.service.dto.DataDto; import org.nl.wql.WQL; import org.nl.wql.core.bean.WQLObject; import org.nl.wql.util.WqlUtil; @@ -27,10 +36,11 @@ import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.net.URLEncoder; +import java.util.*; import java.util.concurrent.atomic.AtomicReference; /** @@ -354,6 +364,118 @@ public class AcceptFormulaServiceImpl implements AcceptFormulaService { return result; } + @Override + @Transactional(rollbackFor = Exception.class) + public void preview(HttpServletResponse response, Map whereJson) throws IOException { + WQLObject formMstTab = WQLObject.getWQLObject("QL_TEST_AcceptFormula"); // 小线试验配方主表 + WQLObject formDtlTab = WQLObject.getWQLObject("QL_TEST_AcceptFormulaDtl"); // 小线试验配方明细表 + WQLObject materTab = WQLObject.getWQLObject("md_me_materialbase"); // 物料表 + WQLObject factMstTab = WQLObject.getWQLObject("QL_TEST_FactoryWarrantyMst"); // 厂家质保书主表 + WQLObject factDtlTab = WQLObject.getWQLObject("QL_TEST_FactoryWarrantyDtl"); // 厂家质保书明细表 + WQLObject markTab = WQLObject.getWQLObject("QL_TEST_AcceptMark"); // 验收牌号表 + WQLObject classTab = WQLObject.getWQLObject("md_pb_classstandard"); // 基本分类表表 + + String formula_id = MapUtil.getStr(whereJson, "formula_id"); + JSONObject jsonFormMst = formMstTab.query("formula_id = '" + formula_id + "'").uniqueResult(0); + JSONObject jsonMater = materTab.query("material_id = '" + jsonFormMst.getString("material_id") + "'").uniqueResult(0); + + // 创建workbook 并获取模板路径 + Workbook workbook = new Workbook(); + String template = SpringContextHolder.getBean(ParamServiceImpl.class).findByCode("ACCEPT_EXCEL_PATH").getValue(); + + workbook.loadFromFile(template); + + // 设置文件名和防止乱码现象 + String fileName = URLEncoder.encode(jsonMater.getString("material_code")+"-"+jsonFormMst.getString("material_pcsn"), "UTF-8"); + response.setHeader("Content-Disposition", "attachment; filename*=UTf-8''"+fileName+".xlsx"); + // 获取输出流 + ServletOutputStream outputStream = response.getOutputStream(); + // 创建模板工作簿 + ExcelWriter workBook = EasyExcel.write(outputStream, DataDto.class).withTemplate(template).build(); + // 获取第一个sheet + WriteSheet sheet = EasyExcel.writerSheet().build(); + + /* + * 单组填充 + */ + HashMap oneMap = new HashMap<>(); + //型号 + oneMap.put("material_name", jsonMater.getString("material_name")); + + // 厂家 + JSONObject jsonFactMst = factMstTab.query("material_id = '" + jsonFormMst.getString("material_id") + "' and pcsn = '" + jsonFormMst.getString("material_pcsn") + "' and is_delete = '0'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonFactMst)) oneMap.put("manufactor", jsonFactMst.getString("manufactor")); + + // 实验牌号 + JSONObject jsonMark= markTab.query("mark_id = '" + jsonFormMst.getString("mark_id") + "' and is_delete = '0'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonMark)) { + oneMap.put("mark_code", jsonMark.getString("mark_code")); + + // 酒精体积:液料比*开单总重 + double bar_bulk = NumberUtil.mul(jsonFormMst.getDoubleValue("confirm_qty"), jsonMark.getDoubleValue("liquid_rate")); + oneMap.put("bar_bulk", NumberUtil.round(bar_bulk, 3).toString()); + + // 合金球重量:球料比*开单总重 + double ball_rate_2 = NumberUtil.mul(jsonFormMst.getDoubleValue("confirm_qty"), jsonMark.getDoubleValue("ball_rate")); + double ball_weight = NumberUtil.div(ball_rate_2, 1000); + oneMap.put("ball_weight", NumberUtil.round(ball_weight, 3).toString()); + + // 球磨时间 + oneMap.put("ball_time", jsonMark.getString("ball_time")); + + // 转速 + oneMap.put("ball_speed", jsonMark.getString("ball_speed")); + + // 原料总碳 + oneMap.put("c_balance", jsonMark.getString("c_balance")); + } + + // 实验批号 + oneMap.put("accept_pcsn", jsonFormMst.getString("accept_pcsn")); + + // 碳平衡:厂家质保书明细对应 + String inspection_item_id = "1510155749437870083"; // ct项点标识 + JSONObject jsonFactDtl = factDtlTab.query("inspection_id = '" + jsonFactMst.getString("inspection_id") + "' and inspection_item_id = '" + inspection_item_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonFactDtl)) { + oneMap.put("ct_value", NumberUtil.round(jsonFactDtl.getString("value"), 2).toString()); + } + + // 开单日期 + oneMap.put("create_time", jsonFormMst.getString("create_time").substring(0,10)); + + /* + * 多组填充 + */ + ArrayList> flData = new ArrayList<>(); + // 查询小线实验配方明细表 + JSONArray formDtlArr = formDtlTab.query("formula_id = '" + jsonFormMst.getString("formula_id") + "'").getResultJSONArray(0); + if (ObjectUtil.isNotEmpty(formDtlArr)) { + for (int i = 0; i < formDtlArr.size(); i++) { + JSONObject json = formDtlArr.getJSONObject(i); + HashMap mapFL = new HashMap<>(); + // 判断物料物料类别是 物料还是物料分类 + String class_name = ""; + if (StrUtil.equals(json.getString("material_type"), "01")) { + // 物料:查物料表关联分类表 + JSONObject jsonDtlMater = materTab.query("material_id = '" + json.getString("material_id") + "'").uniqueResult(0); + JSONObject jsonDtlClass = classTab.query("class_id = '" + jsonDtlMater.getString("material_type_id") + "'").uniqueResult(0); + class_name = jsonDtlClass.getString("class_name"); + } else { + // 分类:直接用明细表的物料标识查基础分类表 + JSONObject jsonDtlClass = classTab.query("class_id = '" + json.getString("material_id") + "'").uniqueResult(0); + class_name = jsonDtlClass.getString("class_name"); + } + mapFL.put("class_name", class_name); + mapFL.put("dtl_pcsn", json.getString("dtl_pcsn")); + mapFL.put("formula_qty", NumberUtil.round(json.getString("formula_qty"), 3).toString()); + flData.add(mapFL); + } + } + workBook.fill(oneMap, sheet); + workBook.fill(new FillWrapper("data", flData), sheet); + workBook.finish(); + } + /** * 新料模式开单 * @param json @@ -700,29 +822,51 @@ public class AcceptFormulaServiceImpl implements AcceptFormulaService { //该批次配粉重量 double X22p = bomdlt_Cr3C2.getDouble("bom_ivt_qty"); + AtomicReference Z_sum = new AtomicReference<>(0.0); + AtomicReference Z_sum_per = new AtomicReference<>(0.0); + //计算不需要移库的添加剂(抑制剂) + yzj_map.forEach((key,tjj_map_jo)->{ + //获取添加剂id + String tjj_material_id = tjj_map_jo.getString("material_id"); + JSONObject tjj_finished = WQL.getWO("QPF_AUTOFORMULA02") + .addParam("material_id",bomdlt_Cr3C2.getString("material_id")) + .addParam("pcsn",bomdlt_Cr3C2.getString("pcsn")) + .addParam("item_material_id",tjj_material_id) + .addParam("flag","5") + .process() + .uniqueResult(0); + if(tjj_finished!=null){ + //质保书含量比 + double value = tjj_finished.getDouble("value"); + //当前含量重量 + double finished = X22p*value/100.0; + + //累计各碳化钨中已含添加剂重量百分比 + Z_sum_per.set(Z_sum_per.get() + value/100.0); + //累计各碳化钨中已含添加剂重量 + Z_sum.set(Z_sum.get() + finished); + } + }); + //获取碳含量 JSONObject FactoryWarranty = bomdlts_plan_map.get(bomdlt_Cr3C2.getString("material_id")); //该批次含碳比 double X22 = FactoryWarranty.getDouble("is_tan"); - // X1减=[产品碳平衡*X1- X1* X22碳含量]/(1- * X22碳含量) + //X22p减=(产品碳平衡*(Z_sum已+CT1_weight)-CT1-Z_sum已)/(1- X22碳含量- X22Z1含量+产品碳平衡*X22Z1含量) - double X22_jian = CT1_weight*(c_balance/100.0-X22/100.0)/(1-X22/100.0); + double X22_jian = ((c_balance/100.0)*(CT1_weight+Z_sum.get())-CT1-Z_sum.get())/(1-X22/100.0-Z_sum_per.get()+(c_balance/100.0)*Z_sum_per.get()); //更新碳化钨配粉重量 double bom_ivt_qty = X22p-X22_jian; if(bom_ivt_qty < 0){ throw new BadRequestException("碳化钨配粉结果为负数,当前配粉无解!"); } - double C = X22_jian; + double C = X22_jian + Z_sum.get(); if(C < 0){ throw new BadRequestException("补碳结果为负数,当前配粉无解!"); }else if(C >= 0){ bomdlt_Cr3C2.put("bom_ivt_qty",bom_ivt_qty); bomdlts_plan_map.put(bomdlt_Cr3C2.getString("material_id"),bomdlt_Cr3C2); - //统计除钨以外其他总重 - AtomicReference total_sum = new AtomicReference<>(0.0); - - total_sum.set(total_sum.get() + bomdlt_Cr3C2.getDouble("bom_ivt_qty")); //计算不需要移库的添加剂(抑制剂) yzj_map.forEach((key,tjj_map_jo)->{ //获取添加剂id @@ -763,7 +907,6 @@ public class AcceptFormulaServiceImpl implements AcceptFormulaService { tjj_map_now.put("is_active","1"); tjj_map_now.put("quality_scode","01"); yzj_list.add(tjj_map_now); - total_sum.set(total_sum.get() + need_qty-finished_qty); } }); if(C>0){ @@ -782,24 +925,6 @@ public class AcceptFormulaServiceImpl implements AcceptFormulaService { C_weight.put("is_active","1"); C_weight.put("quality_scode","01"); cw_list.add(C_weight); - total_sum.set(total_sum.get() + C); - } - double W = new_qty - total_sum.get(); - if(W>0){ - JSONObject W_weight = new JSONObject(); - W_weight.put("formula_qty",W); - //钨分类id - W_weight.put("material_id","1503644362234531840"); - W_weight.put("material_name","钨粉"); - W_weight.put("material_code","09030103"); - W_weight.put("material_type","02"); - W_weight.put("is_need_move","0"); - W_weight.put("is_need_manage","1"); - W_weight.put("is_rf_xl","0"); - W_weight.put("ivt_level","01"); - W_weight.put("is_active","1"); - W_weight.put("quality_scode","01"); - cw_list.add(W_weight); } } } @@ -817,9 +942,31 @@ public class AcceptFormulaServiceImpl implements AcceptFormulaService { //该批次配粉重量 double X22p = bomdlt_Cr3C2.getDouble("bom_ivt_qty"); - // X1减=[产品碳平衡*X1-(X1)* X1碳含量]/(1-X1碳含量) + AtomicReference Z_sum = new AtomicReference<>(0.0); + //计算不需要移库的添加剂(抑制剂) + yzj_map.forEach((key,tjj_map_jo)->{ + //获取添加剂id + String tjj_material_id = tjj_map_jo.getString("material_id"); + JSONObject tjj_finished = WQL.getWO("QPF_AUTOFORMULA01") + .addParam("material_id",bomdlt_Cr3C2.getString("material_id")) + .addParam("pcsn",bomdlt_Cr3C2.getString("pcsn")) + .addParam("item_material_id",tjj_material_id) + .addParam("flag","5") + .process() + .uniqueResult(0); + if(tjj_finished!=null){ + //质保书含量比 + double value = tjj_finished.getDouble("value"); + //当前含量重量 + double finished = X22p*value/100.0; + //累计各碳化钨中已含添加剂重量 + Z_sum.set(Z_sum.get() + finished); + } + }); + + // X21p减=[(X21p)* X21碳含量+软废含碳量-产品碳平衡*(X21p+软废碳化钨)]/X21碳含量 //解得钨粉重量 - double X22_jian = CT1_weight*(c_balance/100.0-X22/100.0) / (1-X22/100.0); + double X22_jian = (CT1 - (c_balance/100.0)*(CT1_weight)) / (X22/100.0); //更新碳化钨配粉重量 double bom_ivt_qty = X22p-X22_jian; if(bom_ivt_qty<=0){ @@ -827,10 +974,6 @@ public class AcceptFormulaServiceImpl implements AcceptFormulaService { } bomdlt_Cr3C2.put("bom_ivt_qty",bom_ivt_qty); bomdlts_plan_map.put(bomdlt_Cr3C2.getString("material_id"),bomdlt_Cr3C2); - //统计除钨以外其他总重 - AtomicReference total_sum = new AtomicReference<>(0.0); - - total_sum.set(total_sum.get() + bomdlt_Cr3C2.getDouble("bom_ivt_qty")); //计算不需要移库的添加剂 yzj_map.forEach((key,tjj_map_jo)->{ //获取添加剂id @@ -871,10 +1014,9 @@ public class AcceptFormulaServiceImpl implements AcceptFormulaService { tjj_map_now.put("is_active","1"); tjj_map_now.put("quality_scode","01"); yzj_list.add(tjj_map_now); - total_sum.set(total_sum.get() + need_qty-finished_qty); } }); - double W = new_qty - total_sum.get(); + double W = X22_jian + Z_sum.get(); if(W>0){ JSONObject W_weight = new JSONObject(); W_weight.put("formula_qty",W); diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/service/impl/FormulaServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/service/impl/FormulaServiceImpl.java index d2c39ac4..3ffcee91 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/service/impl/FormulaServiceImpl.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/service/impl/FormulaServiceImpl.java @@ -47,6 +47,7 @@ import java.awt.print.Paper; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; import java.io.IOException; +import java.math.BigDecimal; import java.net.URLEncoder; import java.util.ArrayList; import java.util.HashMap; @@ -778,7 +779,7 @@ public class FormulaServiceImpl implements FormulaService { } // 球磨相关 oneMap.put("ball_rate",NumberUtil.mul(jsonWork.getDoubleValue("workorder_qty"),jsonMaterExt.getDoubleValue("ball_rate"))); - oneMap.put("liquid_rate",NumberUtil.mul(jsonWork.getDoubleValue("workorder_qty"),jsonMaterExt.getDoubleValue("liquid_rate"))); +// oneMap.put("liquid_rate",NumberUtil.mul(jsonWork.getDoubleValue("workorder_qty"),jsonMaterExt.getDoubleValue("liquid_rate"))); if (ObjectUtil.isNotEmpty(json98jj)) { if (StrUtil.equals(json98jj.getString("value"), "1.00")) { oneMap.put("para_name", json98jj.getString("para_name")); @@ -799,21 +800,25 @@ public class FormulaServiceImpl implements FormulaService { JSONObject jsonQM06 = paraTab.query("material_id = '" + material_id + "' and para_code = 'QM006'").uniqueResult(0); if (ObjectUtil.isNotEmpty(jsonQM13)) oneMap.put("number_1", jsonQM13.getString("value")); if (ObjectUtil.isNotEmpty(jsonQM14)) { -// String number_2 = NumberUtil.mul(masterbucket_qty, NumberUtil.div(jsonQM14.getString("value"), "100").toString()).toString(); -// oneMap.put("number_2", NumberUtil.round(number_2, 2).toString()); - oneMap.put("number_2", jsonQM14.getString("value")); // 待删除 + String number_2 = NumberUtil.mul(masterbucket_qty, NumberUtil.div(jsonQM14.getString("value"), "100").toString()).toString(); + oneMap.put("number_2", NumberUtil.round(number_2, 2).toString()); +// oneMap.put("number_2", jsonQM14.getString("value")); // 待删除 } -// if (ObjectUtil.isNotEmpty(jsonQM04)) oneMap.put("pre_time", jsonQM04.getString("value")); -// if (ObjectUtil.isNotEmpty(jsonQM06)) { -// String pre_fas = NumberUtil.mul(masterbucket_qty, NumberUtil.div(jsonQM06.getString("value"), "100").toString()).toString(); -// oneMap.put("pre_fas", NumberUtil.round(pre_fas, 2).toString()); -// -// double liquid_rate = jsonMaterExt.getDoubleValue("liquid_rate"); -// String put_fas = NumberUtil.mul(jsonMst.getDoubleValue("masterbucket_qty"), liquid_rate, NumberUtil.div(jsonQM06.getString("value"), "100")).toString(); -// oneMap.put("put_fas", NumberUtil.round(put_fas, 2).toString()); -// -// } + if (ObjectUtil.isNotEmpty(jsonQM04)) oneMap.put("pre_time", jsonQM04.getString("value")); + if (ObjectUtil.isNotEmpty(jsonQM06)) { + // 预磨酒精 + String pre_fas = NumberUtil.mul(masterbucket_qty, NumberUtil.div(jsonQM06.getString("value"), "100").toString()).toString(); + oneMap.put("pre_fas", NumberUtil.round(pre_fas, 2).toString()); + + // 投料酒精 + double mul_1 = NumberUtil.mul(jsonMst.getDoubleValue("masterbucket_qty"), jsonMaterExt.getDoubleValue("liquid_rate")); + BigDecimal mul_2 = NumberUtil.mul(jsonMst.getDoubleValue("masterbucket_qty"), NumberUtil.div(jsonQM06.getString("value"), "100")); + String put_fas = NumberUtil.sub(mul_1, mul_2).toString(); + + oneMap.put("put_fas", NumberUtil.round(put_fas, 2).toString()); + + } if (ObjectUtil.isNotEmpty(jsonPW02)) { oneMap.put("number_8", jsonPW02.getString("value")); } diff --git a/mes/qd/src/api/wms/basedata/pdm/wastecchange.js b/mes/qd/src/api/wms/basedata/pdm/wastecchange.js new file mode 100644 index 00000000..dcdaf23b --- /dev/null +++ b/mes/qd/src/api/wms/basedata/pdm/wastecchange.js @@ -0,0 +1,35 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/wastecchange', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/wastecchange/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/wastecchange', + method: 'put', + data + }) +} + +export function confirm(data) { + return request({ + url: 'api/wastecchange/confirm', + method: 'post', + data + }) +} + +export default { add, edit, del, confirm } diff --git a/mes/qd/src/views/wms/basedata/em/equipmentfile/AddDialog.vue b/mes/qd/src/views/wms/basedata/em/equipmentfile/AddDialog.vue index 81ca82ab..e6334cb7 100644 --- a/mes/qd/src/views/wms/basedata/em/equipmentfile/AddDialog.vue +++ b/mes/qd/src/views/wms/basedata/em/equipmentfile/AddDialog.vue @@ -126,6 +126,21 @@ /> + + + + + @@ -283,6 +298,7 @@ const defaultForm = { setting_place: '', device_bom_id: '', theory_beat: '', + device_level: '', oraginal_value: '', net_amount: '', remark: '' @@ -297,7 +313,7 @@ export default { default: false } }, - dicts: ['device_type', 'workorder_type', 'is_produceuse', 'device_status'], + dicts: ['device_type', 'workorder_type', 'is_produceuse', 'device_status', 'device_level'], data() { return { dialogVisible: false, diff --git a/mes/qd/src/views/wms/basedata/em/equipmentfile/ViewDialog.vue b/mes/qd/src/views/wms/basedata/em/equipmentfile/ViewDialog.vue index 01c6c113..83eb5353 100644 --- a/mes/qd/src/views/wms/basedata/em/equipmentfile/ViewDialog.vue +++ b/mes/qd/src/views/wms/basedata/em/equipmentfile/ViewDialog.vue @@ -111,6 +111,22 @@ /> + + + + + @@ -233,7 +249,7 @@ export default { type: Object } }, - dicts: ['device_type', 'workorder_type', 'is_produceuse', 'device_status'], + dicts: ['device_type', 'workorder_type', 'is_produceuse', 'device_status', 'device_level'], data() { return { dialogVisible: false, diff --git a/mes/qd/src/views/wms/basedata/em/equipmentfile/index.vue b/mes/qd/src/views/wms/basedata/em/equipmentfile/index.vue index b6f51976..f476514d 100644 --- a/mes/qd/src/views/wms/basedata/em/equipmentfile/index.vue +++ b/mes/qd/src/views/wms/basedata/em/equipmentfile/index.vue @@ -66,18 +66,6 @@ @keyup.enter.native="crud.toQuery" /> - - - + + + + + + + + @@ -143,7 +160,7 @@ :disabled="sub_flag" @click="submit('10')" > - 启用 + 启用 - 档案维护 + 档案维护 @@ -219,30 +237,31 @@ {{ scope.row.device_code }} - - - - + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + @@ -275,7 +294,7 @@ import { download } from '@/api/data' import { downloadFile } from '@/utils' export default { - name: 'equipmentfile', + name: 'Equipmentfile', components: { Treeselect, ChangeDialog, ViewDialog, AddDialog, crudOperation, rrOperation, udOperation, pagination }, cruds() { return CRUD({ title: '设备档案', idField: 'devicerecord_id', url: 'api/equipmentfile', crudMethod: { ...equipmentfile }, @@ -290,7 +309,7 @@ export default { }, mixins: [presenter(), header(), crud()], // 数据字典 - dicts: ['workorder_status', 'workorder_type', 'product_series', 'device_type', 'is_produceuse', 'device_status'], + dicts: ['device_level', 'workorder_status', 'workorder_type', 'product_series', 'device_type', 'is_produceuse', 'device_status'], data() { return { height: document.documentElement.clientHeight - 180 + 'px;', @@ -421,10 +440,13 @@ export default { this.open_flag = true } } - }else{ + } else { this.handleCurrentChange() } }, + device_levelFormat(row) { + return this.dict.label.device_level[row.device_level] + }, stateFormat(row) { return this.dict.label.device_status[row.status] }, @@ -449,18 +471,18 @@ export default { }, submit(status) { this.checkrows = this.$refs.table.selection - if(this.checkrows.length === 0 ){ + if (this.checkrows.length === 0) { this.crud.notify('请勾选需要操作的记录!') return false } - equipmentfile.submit({ 'status': status, rows: this.checkrows}).then(res => { + equipmentfile.submit({ 'status': status, rows: this.checkrows }).then(res => { this.crud.notify('操作成功!') this.querytable() }) }, openWork(row) { this.checkrows = this.$refs.table.selection - if(this.checkrows.length === 0 ){ + if (this.checkrows.length === 0) { this.crud.notify('请勾选一条需要操作的记录!') return false } @@ -480,6 +502,22 @@ export default { crud.downloadLoading = false }) }, + cellstyle({ row, column, rowIndex, columnIndex }) { + const stylejson = {} + if (column.label === '设备等级') { + if (row.device_level === 'A') { + stylejson.background = 'red' + stylejson.color = 'white' + } else if (row.device_level === 'B') { + stylejson.background = 'blue' + stylejson.color = 'white' + } else if (row.device_level === 'C') { + stylejson.background = 'green' + stylejson.color = 'white' + } + return stylejson + } + }, printCard() { const _selectData = this.$refs.table.selection if (_selectData.length > 1 || _selectData.length === 0) { @@ -578,7 +616,6 @@ export default { color: "#CCCFD6"; - } .vue-treeselect--has-value .vue-treeselect__input { diff --git a/mes/qd/src/views/wms/basedata/pdm/wastecchange/index.vue b/mes/qd/src/views/wms/basedata/pdm/wastecchange/index.vue new file mode 100644 index 00000000..7b347059 --- /dev/null +++ b/mes/qd/src/views/wms/basedata/pdm/wastecchange/index.vue @@ -0,0 +1,329 @@ + + + + + diff --git a/mes/qd/src/views/wms/pdm/produce/dailyplan/index.vue b/mes/qd/src/views/wms/pdm/produce/dailyplan/index.vue index a2a0d628..7054b7c3 100644 --- a/mes/qd/src/views/wms/pdm/produce/dailyplan/index.vue +++ b/mes/qd/src/views/wms/pdm/produce/dailyplan/index.vue @@ -151,7 +151,7 @@ - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - + + + + @@ -223,7 +223,7 @@ export default { url: 'api/dailyplan', idField: 'dailyplan_id', sort: '', - query: { nowstart_date: new Date(),device_id: '' }, + query: { nowstart_date: new Date(),device_id: '', status: '01' }, crudMethod: { ...dailyplan }, optShow: { add: true, diff --git a/mes/qd/src/views/wms/pdm/produce/workorder/ViewDialog.vue b/mes/qd/src/views/wms/pdm/produce/workorder/ViewDialog.vue index f6e2c80e..5b4f76fc 100644 --- a/mes/qd/src/views/wms/pdm/produce/workorder/ViewDialog.vue +++ b/mes/qd/src/views/wms/pdm/produce/workorder/ViewDialog.vue @@ -71,8 +71,8 @@ - - + + - - + + - 关键设备: + + size="mini" + placeholder="关键设备" + class="filter-item" + style="width: 200px" + @change="hand" + > + + @@ -221,7 +231,7 @@ > - - - + + + @@ -247,26 +257,25 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + @@ -293,6 +302,7 @@ import Date from "@/utils/datetime"; import crudWorkProcedure from "@/api/wms/basedata/pdm/workProcedure"; import { download } from '@/api/data' import { downloadFile } from '@/utils' +import producetask from '@/api/wms/pdm/producetask' export default { name: 'workorder', @@ -327,6 +337,7 @@ export default { mstrow: {}, XLList: [], Depts: [], + Devices: [], workProcedureList: [], viewShow: false, changeShow: false, @@ -348,6 +359,9 @@ export default { crudWorkProcedure.downSelect().then(res => { this.workProcedureList = res }) + producetask.getDevices().then(res => { + this.Devices = res + }) workorder.getDepts().then(res => { this.Depts = res }) @@ -440,6 +454,9 @@ export default { workorder_dateFormat(row) { return row.planstart_time.substring(0, 10) }, + planend_timeFormat(row) { + return row.planend_time.substring(0, 10) + }, handleCurrentChange() { this.checkrows = [] this.mstrow = {} @@ -520,6 +537,9 @@ export default { this.crud.toQuery() this.handleCurrentChange() }, + hand(value) { + this.crud.toQuery() + }, printCard() { const _selectData = this.$refs.table.selection if (_selectData.length > 1 || _selectData.length === 0) { diff --git a/mes/qd/src/views/wms/pf/acceptformula/AddDialog.vue b/mes/qd/src/views/wms/pf/acceptformula/AddDialog.vue index 3b0a14ba..9b21e4b3 100644 --- a/mes/qd/src/views/wms/pf/acceptformula/AddDialog.vue +++ b/mes/qd/src/views/wms/pf/acceptformula/AddDialog.vue @@ -258,6 +258,8 @@ :data="tableData" style="width: 100%;" size="mini" + show-summary + :summary-method="getSummaries" border :header-cell-style="{background:'#f5f7fa',color:'#606266'}" > @@ -469,8 +471,8 @@ export default { this.form.liquid_rate = res.liquid_rate this.form.ball_time = res.ball_time this.form.ball_speed = res.ball_speed - this.form.ball_qty = this.form.ball_rate * this.form.accept_qty / 100.0 - this.form.liquid_qty = this.form.liquid_rate * this.form.accept_qty / 100.0 + this.form.ball_qty = this.form.ball_rate * this.form.accept_qty + this.form.liquid_qty = this.form.liquid_rate * this.form.accept_qty }) } }, @@ -506,13 +508,13 @@ export default { this.form.liquid_rate = res.liquid_rate this.form.ball_time = res.ball_time this.form.ball_speed = res.ball_speed - this.form.ball_qty = this.form.ball_rate * this.form.accept_qty / 100.0 - this.form.liquid_qty = this.form.liquid_rate * this.form.accept_qty / 100.0 + this.form.ball_qty = this.form.ball_rate * this.form.accept_qty + this.form.liquid_qty = this.form.liquid_rate * this.form.accept_qty }) }, storChange4(row) { - this.form.ball_qty = this.form.ball_rate * this.form.accept_qty / 100.0 - this.form.liquid_qty = this.form.liquid_rate * this.form.accept_qty / 100.0 + this.form.ball_qty = this.form.ball_rate * this.form.accept_qty + this.form.liquid_qty = this.form.liquid_rate * this.form.accept_qty }, handleClose(done) { this.$confirm('确认关闭?') @@ -533,6 +535,29 @@ export default { this.form.accept_pcsn = res.accept_pcsn }) }, + getSummaries(param) { + const { columns, data } = param + const sums = [] + columns.forEach((column, index) => { + if (index === 0) { + sums[index] = '合计' + return + } + const values = data.map(item => Number(item[column.property])) + if (column.property === 'formula_qty') { + sums[index] = values.reduce((prev, curr) => { + const value = Number(curr) + if (!isNaN(value)) { + return prev + curr + } else { + return prev + } + }, 0) + sums[index] + } + }) + return sums + }, autoCalculation() { this.fullscreenLoading = true crudacceptformula.autoCalculation(this.form).then(res => { diff --git a/mes/qd/src/views/wms/pf/acceptformula/ViewDialog.vue b/mes/qd/src/views/wms/pf/acceptformula/ViewDialog.vue index 9187f887..27c2e6b6 100644 --- a/mes/qd/src/views/wms/pf/acceptformula/ViewDialog.vue +++ b/mes/qd/src/views/wms/pf/acceptformula/ViewDialog.vue @@ -228,6 +228,8 @@ :data="tableData" style="width: 100%;" size="mini" + show-summary + :summary-method="getSummaries" border :header-cell-style="{background:'#f5f7fa',color:'#606266'}" > @@ -358,10 +360,33 @@ export default { this.form.liquid_rate = res.liquid_rate this.form.ball_time = res.ball_time this.form.ball_speed = res.ball_speed - this.form.ball_qty = this.form.ball_rate * this.form.accept_qty / 100.0 - this.form.liquid_qty = this.form.liquid_rate * this.form.accept_qty / 100.0 + this.form.ball_qty = this.form.ball_rate * this.form.accept_qty + this.form.liquid_qty = this.form.liquid_rate * this.form.accept_qty }) }, + getSummaries(param) { + const { columns, data } = param + const sums = [] + columns.forEach((column, index) => { + if (index === 0) { + sums[index] = '合计' + return + } + const values = data.map(item => Number(item[column.property])) + if (column.property === 'formula_qty') { + sums[index] = values.reduce((prev, curr) => { + const value = Number(curr) + if (!isNaN(value)) { + return prev + curr + } else { + return prev + } + }, 0) + sums[index] + } + }) + return sums + }, close() { this.$emit('update:dialogShow', false) this.form = {} diff --git a/mes/qd/src/views/wms/pf/acceptformula/index.vue b/mes/qd/src/views/wms/pf/acceptformula/index.vue index 5308e84c..2c1823a5 100644 --- a/mes/qd/src/views/wms/pf/acceptformula/index.vue +++ b/mes/qd/src/views/wms/pf/acceptformula/index.vue @@ -98,6 +98,8 @@ type="warning" icon="el-icon-check" size="mini" + :disabled="crud.selections.length !== 1" + @click="printExcel" > 打印 @@ -147,6 +149,8 @@ import pagination from '@crud/Pagination' import AddDialog from '@/views/wms/pf/acceptformula/AddDialog' import ViewDialog from '@/views/wms/pf/acceptformula/ViewDialog' import Date from '@/utils/datetime' +import {download} from "@/api/data"; +import {downloadFile} from "@/utils"; export default { name: 'Acceptformula', @@ -229,6 +233,17 @@ export default { }, querytable() { this.crud.toQuery() + }, + printExcel() { + const _selectData = this.$refs.table.selection + const data = _selectData[0] + download('/api/acceptformula/print', { 'formula_id': data.formula_id }).then(result => { + const name = data.material_code + data.accept_pcsn + downloadFile(result, name, 'xlsx') + crud.downloadLoading = false + }).catch(() => { + crud.downloadLoading = false + }) } } } diff --git a/mes/qd/src/views/wms/pf/acceptmark/AddDialog.vue b/mes/qd/src/views/wms/pf/acceptmark/AddDialog.vue index c35c455d..f4d95ada 100644 --- a/mes/qd/src/views/wms/pf/acceptmark/AddDialog.vue +++ b/mes/qd/src/views/wms/pf/acceptmark/AddDialog.vue @@ -156,7 +156,7 @@