From 9fc885b14b9c7be3435f5b979e32950d36fad56b Mon Sep 17 00:00:00 2001 From: liyongde <1419499670@qq.com> Date: Thu, 16 Mar 2023 20:31:08 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E4=B8=8E=E5=B7=A5=E5=8D=95?= =?UTF-8?q?=E5=9F=BA=E7=A1=80CRUD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/nl/wms/enums/WorkerOrderEnum.java | 39 ++ .../mps/rest/ProduceWorkorderController.java | 102 ++++ .../mps/service/ProduceWorkorderService.java | 101 ++++ .../mps/service/dto/ProduceWorkorderDto.java | 175 ++++++ .../impl/ProduceWorkorderServiceImpl.java | 557 ++++++++++++++++++ .../nl/wms/mps/wql/MPS_PRODUCEWORKORDER.wql | 147 +++++ .../src/main/java/org/nl/wms/pdm/wql/pdm.xls | Bin 237056 -> 214016 bytes mes/qd/src/api/wms/mps/produceshiftorder.js | 41 +- mes/qd/src/views/system/notice/NoticeIcon.vue | 2 +- .../src/views/wms/mps/produce/ViewDialog.vue | 43 +- mes/qd/src/views/wms/mps/produce/index.vue | 248 +++----- mes/qd/src/views/wms/pdm/device/index.vue | 87 ++- 12 files changed, 1300 insertions(+), 242 deletions(-) create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/enums/WorkerOrderEnum.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/rest/ProduceWorkorderController.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/service/ProduceWorkorderService.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/service/dto/ProduceWorkorderDto.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/service/impl/ProduceWorkorderServiceImpl.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/wql/MPS_PRODUCEWORKORDER.wql diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/enums/WorkerOrderEnum.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/enums/WorkerOrderEnum.java new file mode 100644 index 00000000..9b98253e --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/enums/WorkerOrderEnum.java @@ -0,0 +1,39 @@ +package org.nl.wms.enums; + +/** + * @Author: lyd + * @Description: 工单枚举 + * @Date: 2023/3/16 + */ +public enum WorkerOrderEnum { + // 1-创建、2-下发、3-生产中、4-暂停、5-完成 + CREATE("创建", "1"), + SEND("下发", "2"), + PRODUCTING("生产中", "3"), + STOP("暂停", "4"), + COMPLETE("完成", "5"), + // 1-PC创建、2-Excel导入 + PCINTO("PC创建", "1"), + EXCELINTO("EXCEL导入", "2"), + // 1白班、2夜班 + DAYSHIFT("白班", "1"), + NIGHTSHIFT("夜班", "2") + ; + + + private String name; + private String code; + + WorkerOrderEnum(String name, String code) { + this.name = name; + this.code = code; + } + + public String getName() { + return name; + } + + public String getCode() { + return code; + } +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/rest/ProduceWorkorderController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/rest/ProduceWorkorderController.java new file mode 100644 index 00000000..0d82cd8a --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/rest/ProduceWorkorderController.java @@ -0,0 +1,102 @@ +package org.nl.wms.mps.rest; + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.anno.Log; +import org.nl.wms.mps.service.ProduceWorkorderService; +import org.nl.wms.mps.service.dto.ProduceWorkorderDto; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; + +/** + * @author lyd + * @date 2023-03-16 + **/ +@RestController +@RequiredArgsConstructor +@Api(tags = "工单管理管理") +@RequestMapping("/api/produceWorkorder") +@Slf4j +public class ProduceWorkorderController { + + private final ProduceWorkorderService produceWorkorderService; + + @GetMapping + @Log("查询工单管理") + @ApiOperation("查询工单管理") + //@PreAuthorize("@el.check('produceWorkorder:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(produceWorkorderService.queryAll(whereJson, page), HttpStatus.OK); + } + + @PostMapping + @Log("新增工单管理") + @ApiOperation("新增工单管理") + //@PreAuthorize("@el.check('produceWorkorder:add')") + public ResponseEntity create(@Validated @RequestBody ProduceWorkorderDto dto) { + produceWorkorderService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改工单管理") + @ApiOperation("修改工单管理") + //@PreAuthorize("@el.check('produceWorkorder:edit')") + public ResponseEntity update(@Validated @RequestBody ProduceWorkorderDto dto) { + produceWorkorderService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除工单管理") + @ApiOperation("删除工单管理") + //@PreAuthorize("@el.check('produceWorkorder:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody String[] ids) { + produceWorkorderService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PostMapping("/getNotWorkDeviceByWorkproceduceId") + @Log("根据工序查询没有工单的设备") + @ApiOperation("根据工序查询没有工单的设备") + //@PreAuthorize("@el.check('WorkProcedure:add')") + public ResponseEntity getNotWorkDeviceByWorkproceduceId(@RequestBody JSONObject param) { + return new ResponseEntity<>(produceWorkorderService.getNotWorkDeviceByWorkproceduceId(param),HttpStatus.CREATED); + } + + @PostMapping("/getDtl") + @Log("获取当前工单下的工单生产记录") + @ApiOperation("获取当前工单下的工单生产记录") + //@PreAuthorize("@el.check('produceshiftorder:list')") + public ResponseEntity getDtl(@RequestBody JSONObject param) { + return new ResponseEntity<>(produceWorkorderService.getDtl(param), HttpStatus.OK); + } + + @PostMapping("/forceFinish") + @Log("工单强制完成") + @ApiOperation("工单强制完成") + //@PreAuthorize("@el.check('produceshiftorder:list')") + public ResponseEntity forceFinish(@RequestBody JSONObject param) { + produceWorkorderService.forceFinish(param); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PostMapping("/excelImport") + @Log("excel导入") + @ApiOperation("excel导入") + public ResponseEntity excelImport(@RequestParam("file") MultipartFile file, HttpServletRequest request) { + produceWorkorderService.excelImport(file, request); + return new ResponseEntity<>(HttpStatus.OK); + } + +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/service/ProduceWorkorderService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/service/ProduceWorkorderService.java new file mode 100644 index 00000000..afd5c0af --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/service/ProduceWorkorderService.java @@ -0,0 +1,101 @@ + +package org.nl.wms.mps.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.mps.service.dto.ProduceWorkorderDto; +import org.springframework.data.domain.Pageable; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.Map; + +/** +* @description 服务接口 +* @author lyd +* @date 2023-03-16 +**/ +public interface ProduceWorkorderService { + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * @param workorder_id ID + * @return ProduceWorkorder + */ + ProduceWorkorderDto findById(String workorder_id); + + /** + * 根据编码查询 + * @param code code + * @return ProduceWorkorder + */ + ProduceWorkorderDto findByCode(String code); + + + /** + * 创建 + * @param dto / + */ + void create(ProduceWorkorderDto dto); + + /** + * 编辑 + * @param dto / + */ + void update(ProduceWorkorderDto dto); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(String[] ids); + + /** + * 更换设备时根据工单所属工序 查询所有工单中没有生产的设备 + * @param param + * @return + */ + JSONArray getNotWorkDeviceByWorkproceduceId(JSONObject param); + + /** + * 获取当前工单的记录 + * @param param + * @return + */ + JSONArray getDtl(JSONObject param); + + /** + * 强制完成 + * @param param + */ + void forceFinish(JSONObject param); + + /** + * 看板强制完成 + * @param param + */ + void finish(JSONObject param); + + /** + * excel导入 + * @param file + * @param request + */ + void excelImport(MultipartFile file, HttpServletRequest request); +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/service/dto/ProduceWorkorderDto.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/service/dto/ProduceWorkorderDto.java new file mode 100644 index 00000000..f94d4e78 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/service/dto/ProduceWorkorderDto.java @@ -0,0 +1,175 @@ +package org.nl.wms.mps.service.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author lyd + * @description / + * @date 2023-03-16 + **/ +@Data +public class ProduceWorkorderDto implements Serializable { + + /** + * 工单编号 + */ + private String workorder_id; + + /** + * 工单编号 + */ + private String workorder_code; + + /** + * 班次类型 + */ + private String shift_type_scode; + + /** + * 工序编码 + */ + private String workprocedure_id; + + /** + * 生产区域 + */ + private String product_area; + + /** + * 计划数量 + */ + private BigDecimal plan_qty; + + /** + * 实际数量 + */ + private BigDecimal real_qty; + + /** + * 人员实际数量 + */ + private BigDecimal person_real_qty; + + /** + * 电气实际数量 + */ + private BigDecimal dq_real_qty; + + /** + * 物料标识 + */ + private String material_id; + + /** + * 物料单重 + */ + private BigDecimal material_weight; + + /** + * 计划生产开始时间 + */ + private String planproducestart_date; + + /** + * 计划生产结束时间 + */ + private String planproduceend_date; + + /** + * 实际生产开始时间 + */ + private String realproducestart_date; + + /** + * 实际生产结束时间 + */ + private String realproduceend_date; + + /** + * 当前生产设备编码 + */ + private String current_device_code; + + /** + * 当前生产人员id + */ + private String current_produce_person_id; + + /** + * 操作工是否允许修改报工数量 + */ + private String is_canupdate_update; + + /** + * 工单状态 + */ + private String workorder_status; + + /** + * 是否搬运 + */ + private String is_needmove; + + /** + * 销售单标识 + */ + private String sale_id; + + /** + * 创建类型 + */ + private String create_type; + + /** + * 工单是否异常 + */ + private String is_error; + + /** + * 异常信息 + */ + private String error_info; + + /** + * 备注 + */ + private String remark; + + /** + * 创建人 + */ + private String create_id; + + /** + * 创建人 + */ + private String create_name; + + /** + * 创建时间 + */ + private String create_time; + + /** + * 修改人 + */ + private String update_id; + + /** + * 修改人 + */ + private String update_name; + + /** + * 修改时间 + */ + private String update_time; + + /** + * 是否删除 + */ + private String is_delete; +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/service/impl/ProduceWorkorderServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/service/impl/ProduceWorkorderServiceImpl.java new file mode 100644 index 00000000..cbf36be1 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/service/impl/ProduceWorkorderServiceImpl.java @@ -0,0 +1,557 @@ + +package org.nl.wms.mps.service.impl; + + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.poi.excel.ExcelReader; +import cn.hutool.poi.excel.ExcelUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.nl.system.service.user.ISysUserService; +import org.nl.system.service.user.dao.SysUser; +import org.nl.wms.basedata.master.service.ClassstandardService; +import org.nl.wms.enums.WorkerOrderEnum; +import org.nl.wms.ext.acs.service.WmsToAcsService; +import org.nl.wms.mps.service.ProduceWorkorderService; +import org.nl.wms.mps.service.WorkOrderImportEnum; +import org.nl.wms.mps.service.dto.ProduceWorkorderDto; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import java.io.InputStream; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author lyd + * @description 服务实现 + * @date 2023-03-16 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class ProduceWorkorderServiceImpl implements ProduceWorkorderService { + + private final ClassstandardService classstandardService; + + private final WmsToAcsService wmsToAcsService; + + private final ISysUserService userService; + + @Override + public Map queryAll(Map whereJson, Pageable page) { + String produceorder_code = MapUtil.getStr(whereJson, "produceorder_code"); + String material = MapUtil.getStr(whereJson, "material"); + String begin_time = MapUtil.getStr(whereJson, "begin_time"); + String end_time = MapUtil.getStr(whereJson, "end_time"); + String order_status = MapUtil.getStr(whereJson, "order_status"); + String shift_type_scode = MapUtil.getStr(whereJson, "shift_type_scode"); + String parent_id = MapUtil.getStr(whereJson, "product_series"); + String sale_id = MapUtil.getStr(whereJson, "sale_id"); + String is_error = MapUtil.getStr(whereJson, "is_error"); + String product_series = ""; + JSONObject map = new JSONObject(); + map.put("flag", "1"); + //map.put("order_status", order_status); + map.put("shift_type_scode", shift_type_scode); + map.put("begin_time", begin_time); + map.put("end_time", end_time); + if (StrUtil.isNotEmpty(order_status)) { + order_status = order_status.replace("[\"", "").replace("\"]", "").replace("\"", ""); + } + map.put("order_status", order_status); + map.put("is_error", is_error); + //处理状态为未完成 + if (StrUtil.isNotEmpty(order_status) && order_status.contains("-1")) { + map.put("unFinish", "-1"); + map.put("order_status", order_status.replace("-1", "")); + } + if (StrUtil.isNotEmpty(parent_id)) { + product_series = classstandardService.getChildIdStr(parent_id); + map.put("product_series", product_series); + } + if (StrUtil.isNotEmpty(produceorder_code)) { + map.put("produceorder_code", "%" + produceorder_code + "%"); + } + if (StrUtil.isNotEmpty(material)) { + map.put("material", "%" + material + "%"); + } + if (StrUtil.isNotEmpty(sale_id)) { + map.put("sale_id", "%" + sale_id + "%"); + } + JSONObject jsonObject = WQL.getWO("MPS_PRODUCEWORKORDER").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "ShiftOrder.update_time desc"); + return jsonObject; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("pdm_produce_workorder"); + JSONArray arr = wo.query().getResultJSONArray(0); + if (ObjectUtil.isNotEmpty(arr)) return arr.toJavaList(ProduceWorkorderDto.class); + return null; + } + + @Override + public ProduceWorkorderDto findById(String workorder_id) { + WQLObject wo = WQLObject.getWQLObject("pdm_produce_workorder"); + JSONObject json = wo.query("workorder_id = '" + workorder_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(ProduceWorkorderDto.class); + } + return null; + } + + @Override + public ProduceWorkorderDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("pdm_produce_workorder"); + JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(ProduceWorkorderDto.class); + } + return null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(ProduceWorkorderDto dto) { + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + dto.setWorkorder_id(IdUtil.getSnowflake(1, 1).nextIdStr()); + dto.setCreate_id(currentUserId); + dto.setCreate_name(nickName); + dto.setUpdate_id(currentUserId); + dto.setUpdate_name(nickName); + dto.setUpdate_time(DateUtil.now()); + dto.setCreate_time(DateUtil.now()); + dto.setWorkorder_id(IdUtil.getSnowflake(1,1).nextIdStr()); + dto.setWorkorder_code(CodeUtil.getNewCode("PDM_SHIFTORDER")); + dto.setCreate_type(WorkerOrderEnum.PCINTO.getCode()); + dto.setWorkorder_status(WorkerOrderEnum.CREATE.getCode()); + WQLObject wo = WQLObject.getWQLObject("pdm_produce_workorder"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(ProduceWorkorderDto dto) { + ProduceWorkorderDto entity = this.findById(dto.getWorkorder_id()); + if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + + dto.setUpdate_time(DateUtil.now()); + dto.setUpdate_id(currentUserId); + dto.setUpdate_name(nickName); + + WQLObject wo = WQLObject.getWQLObject("pdm_produce_workorder"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(String[] ids) { + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + + WQLObject wo = WQLObject.getWQLObject("pdm_produce_workorder"); + for (String workorder_id : ids) { + JSONObject param = new JSONObject(); + param.put("workorder_id", String.valueOf(workorder_id)); + param.put("is_delete", "1"); + param.put("update_optid", currentUserId); + param.put("update_optname", nickName); + param.put("update_time", DateUtil.now()); + wo.update(param); + } + } + + @Override + public JSONArray getNotWorkDeviceByWorkproceduceId(JSONObject param) { + Map res = new HashMap(); + res.put("flag", "2"); + res.put("workprocedure_id", param.getString("workproceduce_id")); + JSONArray resultJSONArray = WQL.getWO("MPS_PRODUCEWORKORDER").addParamMap(res).process().getResultJSONArray(0); + return resultJSONArray; + } + + @Override + public JSONArray getDtl(JSONObject param) { + JSONObject map = new JSONObject(); + map.put("flag", "3"); + map.put("workorder_id", param.getString("workorder_id")); + JSONArray resultJSONArray = WQL.getWO("MPS_PRODUCEWORKORDER").addParamMap(map).process().getResultJSONArray(0); + return resultJSONArray; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void forceFinish(JSONObject param) { + this.finish(param); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void finish(JSONObject param) { + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + JSONObject row = param.getJSONObject("row"); + //强制完成时修改工单状态 + String workorder_id = row.getString("workorder_id"); + WQLObject wo = WQLObject.getWQLObject("PDM_produce_workOrder"); + ProduceWorkorderDto workorderDto = this.findById(workorder_id); + JSONObject produceorderMap = new JSONObject(); + produceorderMap.put("workorder_id", workorder_id); + produceorderMap.put("workorder_status", WorkerOrderEnum.COMPLETE.getCode()); + produceorderMap.put("update_id", currentUserId); + produceorderMap.put("device_code", null); + produceorderMap.put("update_name", nickName); + produceorderMap.put("update_time", DateUtil.now()); + produceorderMap.put("realproduceend_date", DateUtil.now()); + wo.update(produceorderMap); + JSONObject jsonObject = wo.query("workorder_id = '" + workorder_id + "'").uniqueResult(0); + String real_qty = jsonObject.getString("real_qty"); + if (StrUtil.isEmpty(real_qty)) { + real_qty = "0"; + } + //同时修改工单记录表中的期末数量及完成数量 + WQLObject wo_record = WQLObject.getWQLObject("PDM_produce_workOrderRecord"); + JSONObject result = wo_record.query("workorder_id = '" + workorder_id + "' and (operatetime_end = '' or operatetime_end is null) ").uniqueResult(0); + if (ObjectUtil.isNotEmpty(result)) { + // todo: 数量不明确 + result.put("person_finish_qty", real_qty); + result.put("person_report_qty", real_qty); + result.put("operatetime_end", DateUtil.now()); + wo_record.update(result); + } + //工单开工以后需要向acs强制完成 wms向acs发送请求 工单强制完成 + // TODO: 业务不明 + String order_status = workorderDto.getWorkorder_status(); + if (!order_status.equals("1") && !order_status.equals("2")) { + JSONArray array = new JSONArray(); + JSONObject map = new JSONObject(); + map.put("ext_order_id", workorder_id); + map.put("type", "3"); + array.add(map); + wmsToAcsService.orderStatusUpdate(array); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void excelImport(MultipartFile file, HttpServletRequest request) { + // todo: 根据需求修改 + if (file.isEmpty()) { + throw new BadRequestException("文件为空,请添加数据后重新导入"); + } + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + // 1.获取上传文件输入流 + InputStream inputStream = null; + try { + inputStream = file.getInputStream(); + } catch (Exception e) { + e.printStackTrace(); + } + //工单表 + WQLObject wo_order = WQLObject.getWQLObject("PDM_produce_workOrder"); + //物料表 + WQLObject wo_material = WQLObject.getWQLObject("md_me_materialbase"); + //设备表 + WQLObject wo_device = WQLObject.getWQLObject("pdm_bi_device"); + //工序表 + WQLObject wo_workprocedure = WQLObject.getWQLObject("pdm_bi_workprocedure"); + //人员表 + //WQLObject wo_user = WQLObject.getWQLObject("sys_user"); + + // 调用用 hutool 方法读取数据 调用第一个sheet白班数据 + ExcelReader excelReader = ExcelUtil.getReader(inputStream, 0); + // 从第1行开始获取数据 excelReader.read的结果是一个2纬的list,外层是行,内层是行对应的所有列 + List> read = excelReader.read(0, excelReader.getRowCount()); + String produce_date = ""; + // 循环获取的数据 + row: + for (int i = 0; i < read.size(); i++) { + List list = read.get(i); + if (ObjectUtil.isEmpty(list)) { + continue; + } + //获取每列 + JSONObject param = new JSONObject(); + //按照列获取 + param.put("workorder_id", IdUtil.getSnowflake(1, 1).nextId()); + param.put("workorder_code", CodeUtil.getNewCode("PDM_SHIFTORDER")); + param.put("macoperate_id", IdUtil.getSnowflake(1, 1).nextId()); + param.put("workorder_status", WorkerOrderEnum.CREATE.getCode()); + param.put("shift_type_scode", WorkerOrderEnum.DAYSHIFT.getCode()); // 默认白班 + String is_error = "0"; + String error_message = ""; + //循环每一行 + col: + for (int j = 0; j < list.size(); j++) { + + String col = String.valueOf(list.get(j)); + //如果是第一行 为生产日期 + if (i == 0 && j == 0) { + produce_date = col.split(":")[col.split(":").length - 1]; + continue row; + } + //如果第一列包含规格二字 则为表头 结束内循环列 + if (j == 0 && col.contains("规格名称")) { + continue row; + } + if (j == 0) { + //物料 + if (StrUtil.isEmpty(col)) { + is_error = "1"; + error_message = error_message + "物料规格为空,"; + } + JSONObject json_material = wo_material.query("is_delete = '0' and material_spec = '" + col + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(json_material)) { + is_error = "1"; + error_message = error_message + "物料规格对应物料信息不存在,"; + }else { + param.put("material_id", json_material.getString("material_id")); + } + } + if (j == 2) { + if (StrUtil.isEmpty(col)) { + is_error = "1"; + error_message = error_message + "工序名称为空,"; + } + WorkOrderImportEnum idByName = WorkOrderImportEnum.getIdByName(col); + if (ObjectUtil.isEmpty(idByName)) { + is_error = "1"; + error_message = error_message + "工序名称是否正确,"; + }else { + param.put("workprocedure_id", idByName.getId()); + } + } + if (j == 4) { + //单重 + param.put("material_weight", col); + } + if (j == 6) { + if (StrUtil.isEmpty(col)) { + is_error = "1"; + error_message = error_message + "工单计划数量为空,"; + }else { + param.put("plan_qty", col); + } + } + if (j == 10) { + String workprocedure_id = param.getString("workprocedure_id"); + JSONObject json_device = wo_device.query("is_delete = '0' and device_code = '" + col + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(json_device)) { + is_error = "1"; + error_message = error_message + "设备编码不存在,"; + } + if (!workprocedure_id.equals(json_device.getString("workprocedure_id"))) { + is_error = "1"; + error_message = error_message + "设备与所属工序不匹配,"; + }else { + param.put("device_id", json_device.getString("device_id")); + } + } + if (j == 11) { + SysUser jsonUser = userService.getOne(new QueryWrapper().eq("username", SecurityUtils.getCurrentUsername())); + if (ObjectUtil.isEmpty(jsonUser)) { + is_error = "1"; + error_message = error_message + "生产人员编码不存在!"; + }else { + param.put("jockey_id", jsonUser.getUserId()); + } + } + if (j == 12) { + //允许修改报工数量 + String is_canupdate = "0"; + if (col.equals("是")) { + is_canupdate = "1"; + } + param.put("is_canupdate_update", is_canupdate); + } + if (j == 13) { + //是否agv搬运 + String needmoce = "0"; + if (col.equals("是")) { + needmoce = "1"; + } + param.put("is_needmove", needmoce); + } + } + param.put("is_error", is_error); + param.put("error_info", error_message); + param.put("planproducestart_date", produce_date + "07:30:00"); + param.put("planproduceend_date", produce_date + "18:30:00"); + param.put("create_id", currentUserId); + param.put("create_name", nickName); + param.put("create_time", DateUtil.now()); + wo_order.insert(param); + } + + // 1.获取上传文件输入流 + inputStream = null; + try { + inputStream = file.getInputStream(); + } catch (Exception e) { + e.printStackTrace(); + } + //读取夜班工单数据 + excelReader = ExcelUtil.getReader(inputStream, 1); + read = excelReader.read(0, excelReader.getRowCount()); + String is_error = "0"; + String error_message = ""; + // 循环获取的数据 + row: + for (int i = 0; i < read.size(); i++) { + List list = read.get(i); + //获取每列 + JSONObject param = new JSONObject(); + //按照列获取 + param.put("produceorder_id", IdUtil.getSnowflake(1, 1).nextId()); + param.put("produceorder_code", CodeUtil.getNewCode("PDM_SHIFTORDER")); + param.put("producedeviceorder_code", CodeUtil.getNewCode("PDM_SHIFTORDER")); + param.put("order_status", "00"); + param.put("order_type_scode", "01"); + param.put("produce_date", produce_date); + param.put("shift_type_scode", "02"); + //循环每一行 + col: + for (int j = 0; j < list.size(); j++) { + + String col = String.valueOf(list.get(j)); + //如果是第一行 为生产日期 + if (i == 0 && j == 0) { + produce_date = col.split(":")[col.split(":").length - 1]; + continue row; + } + //如果第一列包含规格二字 则为表头 结束内循环列 + if (j == 0 && col.contains("规格名称")) { + continue row; + } + if (j == 0) { + //物料 + if (StrUtil.isEmpty(col)) { + is_error = "1"; + error_message = error_message + "物料规格为空,"; + } + JSONObject json_material = wo_material.query("is_delete = '0' and material_spec = '" + col + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(json_material)) { + is_error = "1"; + error_message = error_message + "物料规格对应物料信息不存在,"; + }else { + param.put("material_id", json_material.getString("material_id")); + } + } + if (j == 2) { + if (StrUtil.isEmpty(col)) { + is_error = "1"; + error_message = error_message + "工序名称为空,"; + } + WorkOrderImportEnum idByName = WorkOrderImportEnum.getIdByName(col); + if (ObjectUtil.isEmpty(idByName)) { + is_error = "1"; + error_message = error_message + "工序名称是否正确,"; + }else { + param.put("workprocedure_id", idByName.getId()); + } + } + if (j == 4) { + //单重 + param.put("material_weight", col); + } + if (j == 6) { + if (StrUtil.isEmpty(col)) { + is_error = "1"; + error_message = error_message + "工单计划数量为空,"; + }else { + param.put("plan_qty", col); + } + } +// if (j == 10) { +// //物料 +// JSONObject json_material = wo_material.query("is_delete = '0' and material_code = '" + col + "'").uniqueResult(0); +// if (ObjectUtil.isEmpty(json_material)) { +// throw new BadRequestException("第'" + (i + 2) + "'行,物料编码不存在"); +// } +// param.put("material_id", json_material.getString("material_id")); +// } + if (j == 10) { + String workprocedure_id = param.getString("workprocedure_id"); + JSONObject json_device = wo_device.query("is_delete = '0' and device_code = '" + col + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(json_device)) { + is_error = "1"; + error_message = error_message + "设备编码不存在,"; + } + if (!workprocedure_id.equals(json_device.getString("workprocedure_id"))) { + is_error = "1"; + error_message = error_message + "设备与所属工序不匹配,"; + }else { + param.put("device_id", json_device.getString("device_id")); + } + } + if (j == 11) { + SysUser jsonUser = userService.getOne(new QueryWrapper().eq("username", SecurityUtils.getCurrentUsername())); + if (ObjectUtil.isEmpty(jsonUser)) { + is_error = "1"; + error_message = error_message + "生产人员编码不存在!"; + }else { + param.put("jockey_id", jsonUser.getUserId()); + } + } + if (j == 12) { + //允许修改报工数量 + String is_canupdate = "0"; + if (col.equals("是")) { + is_canupdate = "1"; + } + param.put("is_canupdate_update", is_canupdate); + } + if (j == 13) { + //是否agv搬运 + String needmoce = "0"; + if (col.equals("是")) { + needmoce = "1"; + } + param.put("is_needmove", needmoce); + } + } + param.put("is_error", is_error); + param.put("error_info", error_message); + param.put("planproducestart_date", produce_date + "18:30:00"); + DateTime dateTime = DateUtil.offsetDay(DateUtil.parse(produce_date), 1); + param.put("planproduceend_date", DateUtil.format(dateTime,"yyyy-MM-dd") + " 07:30:00"); + param.put("create_id", currentUserId); + param.put("create_name", nickName); + param.put("create_time", DateUtil.now()); + wo_order.insert(param); + } + + } + +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/wql/MPS_PRODUCEWORKORDER.wql b/mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/wql/MPS_PRODUCEWORKORDER.wql new file mode 100644 index 00000000..d331cafd --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/wql/MPS_PRODUCEWORKORDER.wql @@ -0,0 +1,147 @@ +[交易说明] + 交易名: 工单分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.jockey_id TYPEAS s_string + 输入.sale_id TYPEAS s_string + 输入.produceorder_id TYPEAS s_string + 输入.workprocedure_code TYPEAS s_string + 输入.order_status TYPEAS s_string + 输入.shift_type_scode TYPEAS s_string + 输入.begin_time TYPEAS s_string + 输入.end_time TYPEAS s_string + 输入.produceorder_code TYPEAS s_string + 输入.material TYPEAS s_string + 输入.is_error TYPEAS s_string + 输入.product_series TYPEAS f_string + 输入.workprocedure_ids TYPEAS f_string + 输入.workprocedure_id TYPEAS f_string + 输入.unFinish TYPEAS s_string + 输入.device_ids TYPEAS f_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + ShiftOrder.*, + material.material_name, + material.material_code, + material.material_spec, + pro.workprocedure_code, + pro.workprocedure_name, + user.person_name + FROM + PDM_produce_workOrder ShiftOrder + left join md_me_materialbase material on material.material_id = ShiftOrder.material_id + left join PDM_BI_WorkProcedure pro on pro.workprocedure_id = ShiftOrder.workprocedure_id + left join sys_user user on user.user_id = ShiftOrder.current_produce_person_id + WHERE + ShiftOrder.is_delete = '0' + OPTION 输入.unFinish <> "" + ShiftOrder.workorder_status <> '5' + ENDOPTION + OPTION 输入.order_status <> "" + find_in_set( ShiftOrder.workorder_status, 输入.order_status) + ENDOPTION + OPTION 输入.shift_type_scode <> "" + ShiftOrder.shift_type_scode = 输入.shift_type_scode + ENDOPTION + OPTION 输入.is_error <> "" + ShiftOrder.is_error = 输入.is_error + ENDOPTION + OPTION 输入.product_series <> "" + material.product_series in 输入.product_series + ENDOPTION + OPTION 输入.begin_time <> "" + ShiftOrder.produce_date >= 输入.begin_time + ENDOPTION + OPTION 输入.end_time <> "" + ShiftOrder.produce_date <= 输入.end_time + ENDOPTION + OPTION 输入.sale_id <> "" + ShiftOrder.sale_id like 输入.sale_id + ENDOPTION + OPTION 输入.workprocedure_code <> "" + ShiftOrder.workprocedure_code like 输入.workprocedure_code + ENDOPTION + OPTION 输入.material <> "" + ( + material.material_code like 输入.material or + material.material_name like 输入.material or + material.material_spec like 输入.material + ) + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF + IF 输入.flag = "2" + QUERY + SELECT + device.* + FROM + pdm_bi_device device + WHERE + device.is_delete = '0' + OPTION 输入.workprocedure_id <> "" + device.workprocedure_id = 输入.workprocedure_id + and device.device_code not in ( + select o.current_device_code as device_code + from PDM_produce_workOrder o + where o.workorder_status <> '5' + ) + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + IF 输入.flag = "3" + QUERY + SELECT + record.*, + device.device_code, + device.device_name + FROM + PDM_produce_workOrderRecord record + LEFT JOIN PDM_BI_Device device ON record.device_code = device.device_code + WHERE + 1 = 1 + OPTION 输入.workorder_id <> "" + record.workorder_id = 输入.workorder_id + ENDOPTION + order by record.seq_number + ENDSELECT + ENDQUERY + ENDIF 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 7358e5b87851fd38a211f0f38251e01471d7eb0d..efd69e8b144e2b4666a85e1de27467073d0af332 100644 GIT binary patch delta 23491 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 WA`5@@BlcMoFZ!d1lqdVBmj4g-E`#p? diff --git a/mes/qd/src/api/wms/mps/produceshiftorder.js b/mes/qd/src/api/wms/mps/produceshiftorder.js index 5ce55907..2ed7dc8f 100644 --- a/mes/qd/src/api/wms/mps/produceshiftorder.js +++ b/mes/qd/src/api/wms/mps/produceshiftorder.js @@ -2,7 +2,7 @@ import request from '@/utils/request' export function add(data) { return request({ - url: 'api/produceshiftorder', + url: 'api/produceWorkorder', method: 'post', data }) @@ -10,7 +10,7 @@ export function add(data) { export function addRows(data) { return request({ - url: 'api/produceshiftorder/addRows', + url: 'api/produceWorkorder/addRows', method: 'post', data }) @@ -18,7 +18,7 @@ export function addRows(data) { export function del(ids) { return request({ - url: 'api/produceshiftorder/', + url: 'api/produceWorkorder/', method: 'delete', data: ids }) @@ -26,7 +26,7 @@ export function del(ids) { export function edit(data) { return request({ - url: 'api/produceshiftorder', + url: 'api/produceWorkorder', method: 'put', data }) @@ -34,7 +34,7 @@ export function edit(data) { export function submits(data) { return request({ - url: 'api/produceshiftorder/submits', + url: 'api/produceWorkorder/submits', method: 'put', data }) @@ -42,7 +42,7 @@ export function submits(data) { export function getDevice(data) { return request({ - url: 'api/produceshiftorder/getDevice', + url: 'api/produceWorkorder/getDevice', method: 'post', data }) @@ -50,7 +50,7 @@ export function getDevice(data) { export function getTable(data) { return request({ - url: 'api/produceshiftorder/getTable', + url: 'api/produceWorkorder/getTable', method: 'post', data }) @@ -58,7 +58,7 @@ export function getTable(data) { export function openStart(data) { return request({ - url: 'api/produceshiftorder/openStart', + url: 'api/produceWorkorder/openStart', method: 'post', data }) @@ -66,7 +66,7 @@ export function openStart(data) { export function saveReport(data) { return request({ - url: 'api/produceshiftorder/saveReport', + url: 'api/produceWorkorder/saveReport', method: 'post', data }) @@ -74,7 +74,7 @@ export function saveReport(data) { export function finish(data) { return request({ - url: 'api/produceshiftorder/finish', + url: 'api/produceWorkorder/finish', method: 'post', data }) @@ -82,7 +82,7 @@ export function finish(data) { export function forceFinish(data) { return request({ - url: 'api/produceshiftorder/forceFinish', + url: 'api/produceWorkorder/forceFinish', method: 'post', data }) @@ -90,7 +90,7 @@ export function forceFinish(data) { export function getReportWork(data) { return request({ - url: 'api/produceshiftorder/getReportWork', + url: 'api/produceWorkorder/getReportWork', method: 'post', data }) @@ -98,7 +98,7 @@ export function getReportWork(data) { export function getDtl(data) { return request({ - url: 'api/produceshiftorder/getDtl', + url: 'api/produceWorkorder/getDtl', method: 'post', data }) @@ -106,7 +106,7 @@ export function getDtl(data) { export function excelImport(data) { return request({ - url: 'api/produceshiftorder/excelImport', + url: 'api/produceWorkorder/excelImport', method: 'post', data }) @@ -114,7 +114,7 @@ export function excelImport(data) { export function getNotWorkDeviceByWorkproceduceId(data) { return request({ - url: 'api/produceshiftorder/getNotWorkDeviceByWorkproceduceId', + url: 'api/produceWorkorder/getNotWorkDeviceByWorkproceduceId', method: 'post', data }) @@ -122,17 +122,10 @@ export function getNotWorkDeviceByWorkproceduceId(data) { export function replaceDevice(data) { return request({ - url: 'api/produceshiftorder/replaceDevice', + url: 'api/produceWorkorder/replaceDevice', method: 'post', data }) } -export function getUser() { - return request({ - url: 'api/produceshiftorder/getUser', - method: 'get' - }) -} - -export default { add, addRows, edit, del, submits, getDevice, getTable, openStart, saveReport, finish, getReportWork, forceFinish, getDtl, excelImport, getNotWorkDeviceByWorkproceduceId, replaceDevice, getUser } +export default { add, addRows, edit, del, submits, getDevice, getTable, openStart, saveReport, finish, getReportWork, forceFinish, getDtl, excelImport, getNotWorkDeviceByWorkproceduceId, replaceDevice } diff --git a/mes/qd/src/views/system/notice/NoticeIcon.vue b/mes/qd/src/views/system/notice/NoticeIcon.vue index 343f341f..1a29b4cc 100644 --- a/mes/qd/src/views/system/notice/NoticeIcon.vue +++ b/mes/qd/src/views/system/notice/NoticeIcon.vue @@ -7,7 +7,7 @@

- +
diff --git a/mes/qd/src/views/wms/mps/produce/ViewDialog.vue b/mes/qd/src/views/wms/mps/produce/ViewDialog.vue index 9bd3edc5..571ba095 100644 --- a/mes/qd/src/views/wms/mps/produce/ViewDialog.vue +++ b/mes/qd/src/views/wms/mps/produce/ViewDialog.vue @@ -10,17 +10,7 @@ - - - - - - + - - - @@ -89,9 +76,6 @@ style="width: 200px;" /> - - - + + + - - - - - - - + + + + + + + + - 取 消 确定 @@ -227,8 +214,8 @@ export default { classes3: [], form: { sale_id: null, - produceorder_id: null, - produceorder_code: null, + workorder_id: null, + workorder_code: null, producedeviceorder_code: null, shift_type_scode: null, workprocedure_id: null, @@ -278,7 +265,7 @@ export default { this.getworkprocedure() this.initClass3() this.is_null() - crudProduceshiftorder.getDtl({ produceorder_id: this.form.produceorder_id }).then(res => { + crudProduceshiftorder.getDtl({ workorder_id: this.form.workorder_id }).then(res => { this.tableData = res }) }, diff --git a/mes/qd/src/views/wms/mps/produce/index.vue b/mes/qd/src/views/wms/mps/produce/index.vue index cc96383d..cb6f743a 100644 --- a/mes/qd/src/views/wms/mps/produce/index.vue +++ b/mes/qd/src/views/wms/mps/produce/index.vue @@ -31,23 +31,6 @@ class="filter-item" /> - - - - - - - - + /> @@ -204,16 +180,6 @@ width="1200px" > - - - - - - - + + + + @@ -282,9 +260,6 @@ style="width: 200px;" /> - - - @@ -327,42 +302,6 @@ >{{ item.label }} -                         - - - - - - - - - - - - -