From ac9b0fbc3ee9e54866c36eaea3c5a8eca878be2d Mon Sep 17 00:00:00 2001 From: 18188916393 <2562295436@qq.com> Date: Thu, 4 Aug 2022 10:29:54 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B7=9Facs=E6=B5=8B=E8=AF=95=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/nl/wms/common/wql/QSTRUCT_RULE.wql | 4 + .../nl/wms/dump/rest/DumpinvController.java | 102 +++++ .../wms/dump/rest/MaterialbaseController.java | 50 +++ .../nl/wms/dump/service/DumpinvService.java | 98 +++++ .../wms/dump/service/MaterialbaseService.java | 33 ++ .../nl/wms/dump/service/dto/DumpinvDto.java | 129 +++++++ .../wms/dump/service/dto/MaterialbaseDto.java | 99 +++++ .../dump/service/impl/DumpinvServiceImpl.java | 352 ++++++++++++++++++ .../service/impl/MaterialbaseServiceImpl.java | 58 +++ .../org/nl/wms/dump/wql/QMD_ME_MATERIAL.wql | 133 +++++++ .../wms/ext/acs/rest/AcsToWmsController.java | 6 + .../wms/ext/acs/service/AcsToWmsService.java | 9 + .../wms/ext/acs/service/WmsToAcsService.java | 1 - .../acs/service/impl/AcsToWmsServiceImpl.java | 81 +++- .../callEmpty/rest/CallEmptyController.java | 2 - .../service/impl/CallMaterialServiceImpl.java | 113 +++++- .../nl/wms/pda/login/wql/QPADSTSETSERVICE.wql | 18 +- .../pda/pressout/rest/PressOutController.java | 47 +++ .../pressout/service/PressurelOutService.java | 16 + .../service/impl/PressureOutServiceImpl.java | 109 ++++++ .../service/impl/SendMaterialServiceImpl.java | 10 +- .../service/impl/ProducetaskServiceImpl.java | 2 +- .../org/nl/wms/pdm/wql/PDM_ProduceTask_01.wql | 5 +- .../nl/wms/sch/manage/AbstractAcsTask.java | 4 +- .../java/org/nl/wms/sch/manage/AreaEnum.java | 6 +- .../org/nl/wms/sch/manage/buss/DumpTask.java | 136 +++++++ .../java/org/nl/wms/sch/task/AcsTaskDto.java | 2 +- .../org/nl/wms/sch/task/AutoCreateTask.java | 4 +- .../main/java/org/nl/wms/sch/task/InTask.java | 18 +- .../service/wql/ST_StructRelaMaterial_01.wql | 53 +-- .../wql/ST_Structrelavehicletype_01.wql | 42 ++- .../src/main/java/org/nl/wms/wms.xls | Bin 366592 -> 399872 bytes 32 files changed, 1653 insertions(+), 89 deletions(-) create mode 100644 wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/rest/DumpinvController.java create mode 100644 wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/rest/MaterialbaseController.java create mode 100644 wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/service/DumpinvService.java create mode 100644 wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/service/MaterialbaseService.java create mode 100644 wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/service/dto/DumpinvDto.java create mode 100644 wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/service/dto/MaterialbaseDto.java create mode 100644 wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/service/impl/DumpinvServiceImpl.java create mode 100644 wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/service/impl/MaterialbaseServiceImpl.java create mode 100644 wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/wql/QMD_ME_MATERIAL.wql create mode 100644 wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/pressout/rest/PressOutController.java create mode 100644 wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/pressout/service/PressurelOutService.java create mode 100644 wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/pressout/service/impl/PressureOutServiceImpl.java create mode 100644 wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/DumpTask.java diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/wql/QSTRUCT_RULE.wql b/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/wql/QSTRUCT_RULE.wql index 3b377b1..9f4219a 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/wql/QSTRUCT_RULE.wql +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/wql/QSTRUCT_RULE.wql @@ -77,6 +77,8 @@ IF 输入.flag = "2" left join st_rule_IOdisStruct ruledis on ruledis.struct_uuid = structattr.struct_id WHERE point.lock_type = '00' + AND point.point_type<>'05' + AND point.point_type<>'01' AND ( point.vehicle_code = '' OR point.vehicle_code IS NULL ) AND point.is_used = '1' AND point.point_status = '00' @@ -108,6 +110,8 @@ IF 输入.flag = "3" ivt.canuse_qty, ivt.workprocedure_id, ivt.qty_unit_id, + ivt.pcsn, + ivt.qty_unit_id, ruledis.out_seq_no FROM st_ivt_structivt ivt diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/rest/DumpinvController.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/rest/DumpinvController.java new file mode 100644 index 0000000..9175e22 --- /dev/null +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/rest/DumpinvController.java @@ -0,0 +1,102 @@ + +package org.nl.wms.dump.rest; + + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.annotation.Log; +import org.nl.wms.dump.service.DumpinvService; +import org.nl.wms.dump.service.dto.DumpinvDto; +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 javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Map; + +/** +* @author qinx +* @date 2022-02-15 +**/ +@RestController +@RequiredArgsConstructor +@Api(tags = "转储单设置管理") +@RequestMapping("/api/dumpinv") +@Slf4j +public class DumpinvController { + + private final DumpinvService dumpinvService; + + @GetMapping + @Log("查询转储单设置") + @ApiOperation("查询转储单设置") + //@PreAuthorize("@el.check('dumpinv:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page){ + return new ResponseEntity<>(dumpinvService.queryAll(whereJson,page),HttpStatus.OK); + } + + @PostMapping + @Log("新增转储单设置") + @ApiOperation("新增转储单设置") + //@PreAuthorize("@el.check('dumpinv:add')") + public ResponseEntity create(@Validated @RequestBody DumpinvDto dto){ + dumpinvService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改转储单设置") + @ApiOperation("修改转储单设置") + //@PreAuthorize("@el.check('dumpinv:edit')") + public ResponseEntity update(@Validated @RequestBody DumpinvDto dto){ + dumpinvService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除转储单设置") + @ApiOperation("删除转储单设置") + //@PreAuthorize("@el.check('dumpinv:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody String[] ids) { + dumpinvService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @Log("导出转储单设置") + @ApiOperation("导出转储单设置") + @GetMapping(value = "/download") + //@PreAuthorize("@el.check('dumpinv:list')") + public void download(HttpServletResponse response, Map whereJson) throws IOException { + dumpinvService.download(dumpinvService.queryAll(whereJson), response); + } + @PostMapping(value ="/crateTask") + @Log("生产任务并且下发") + @ApiOperation("生产任务并且下发") + //@PreAuthorize("@el.check('dumpinv:add')") + public ResponseEntity crateTask(@Validated @RequestBody DumpinvDto dto){ + dumpinvService.crateTask(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PostMapping(value ="/finshTask") + @Log("生产任务并且下发") + @ApiOperation("生产任务并且下发") + //@PreAuthorize("@el.check('dumpinv:add')") + public ResponseEntity finshTask(@Validated @RequestBody DumpinvDto dto){ + dumpinvService.finshTask(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + @PostMapping("/dis") + @Log("组盘分配任务并审核") + @ApiOperation("组盘分配任务并审核") + //@PreAuthorize("@el.check('dumpinv:add')") + public ResponseEntity dis( @RequestBody Map map){ + dumpinvService.dis(map); + return new ResponseEntity<>(HttpStatus.CREATED); + } +} diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/rest/MaterialbaseController.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/rest/MaterialbaseController.java new file mode 100644 index 0000000..70c2cc9 --- /dev/null +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/rest/MaterialbaseController.java @@ -0,0 +1,50 @@ + +package org.nl.wms.dump.rest; + + +import cn.hutool.core.map.MapUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.annotation.Log; + +import org.nl.wms.dump.service.MaterialbaseService; +import org.nl.wms.dump.service.dto.MaterialbaseDto; +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 java.util.Map; + +/** + * @author zhouz + * @date 2021-12-07 + **/ +@RestController +@RequiredArgsConstructor +@Api(tags = "仓储库存物料选择") +@RequestMapping("/api/Materialbase") +@Slf4j +public class MaterialbaseController { + + private final MaterialbaseService materialBaseService; + + @GetMapping + @Log("查询物料") + @ApiOperation("查询物料") + //@PreAuthorize("@el.check('Materialbase:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(materialBaseService.queryAll(whereJson, page), HttpStatus.OK); + } + + @GetMapping("/EmptyStruct") + @Log("查询空仓位") + @ApiOperation("查询空仓位") + //@PreAuthorize("@el.check('Materialbase:list')") + public ResponseEntity queryEmptyStruct(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(materialBaseService.queryEmptyStruct(whereJson, page), HttpStatus.OK); + } +} diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/service/DumpinvService.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/service/DumpinvService.java new file mode 100644 index 0000000..a4f7c05 --- /dev/null +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/service/DumpinvService.java @@ -0,0 +1,98 @@ + +package org.nl.wms.dump.service; + +import org.nl.wms.dump.service.dto.DumpinvDto; +import org.springframework.data.domain.Pageable; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +/** + * @author qinx + * @description 服务接口 + * @date 2022-02-15 + **/ +public interface DumpinvService { + + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * + * @param dumpinv_uuid ID + * @return Dumpinv + */ + DumpinvDto findById(String dumpinv_uuid); + + /** + * 根据编码查询 + * + * @param code code + * @return Dumpinv + */ + DumpinvDto findByCode(String code); + + + /** + * 创建 + * + * @param dto / + */ + void create(DumpinvDto dto); + + /** + * 编辑 + * + * @param dto / + */ + void update(DumpinvDto dto); + + /** + * 多选删除 + * + * @param ids / + */ + void deleteAll(String[] ids); + + /** + * 导出数据 + * + * @param dtos 待导出的数据 + * @param response / + * @throws IOException / + */ + void download(List dtos, HttpServletResponse response) throws IOException; + + /** + * 生成任务 + * + * @param dto / + */ + void crateTask(DumpinvDto dto); + + /** + * 任务完成 + * + * @param dto / + */ + void finshTask(DumpinvDto dto); + + void dis(Map map); +} diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/service/MaterialbaseService.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/service/MaterialbaseService.java new file mode 100644 index 0000000..cd98127 --- /dev/null +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/service/MaterialbaseService.java @@ -0,0 +1,33 @@ + +package org.nl.wms.dump.service; + +import org.springframework.data.domain.Pageable; + +import java.util.Map; + +/** + * @author zhouz + * @description 服务接口 + * @date 2021-12-07 + **/ +public interface MaterialbaseService { + + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + /** + * 查询空仓位 + * + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryEmptyStruct(Map whereJson, Pageable page); + + +} diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/service/dto/DumpinvDto.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/service/dto/DumpinvDto.java new file mode 100644 index 0000000..f6120a2 --- /dev/null +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/service/dto/DumpinvDto.java @@ -0,0 +1,129 @@ +package org.nl.wms.dump.service.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author qinx + * @description / + * @date 2022-02-15 + **/ +@Data +public class DumpinvDto implements Serializable { + + /** + * 转储单标识 + */ + private String dumpinv_id; + + /** + * 单据编号 + */ + private String bill_code; + + /** + * 单据状态 + */ + private String bill_status; + + /** + * 转出仓位标识 + */ + private String turnout_struct_id; + + /** + * 转出仓位编码 + */ + private String turnout_struct_code; + + /** + * 转出仓位名称 + */ + private String turnout_struct_name; + + /** + * 转入仓位标识 + */ + private String turnin_struct_id; + + /** + * 转入仓位编码 + */ + private String turnin_struct_code; + + /** + * 转入仓位名称 + */ + private String turnin_struct_name; + + /** + * 工序标识 + */ + private String workprocedure_id; + + /** + * 物料标识 + */ + private String material_id; + + /** + * 批次 + */ + private String pcsn; + + /** + * 数量计量单位标识 + */ + private String qty_unit_id; + + /** + * 数量 + */ + private BigDecimal qty; + + /** + * 载具号 + */ + private String vehicle_code; + + /** + * 备注 + */ + private String remark; + + /** + * 是否启用 + */ + private String is_active; + + /** + * 是否删除 + */ + private String is_delete; + + /** + * 创建者 + */ + private String create_by; + + /** + * 创建时间 + */ + private String create_time; + + /** + * 修改者 + */ + private String update_by; + + /** + * 修改时间 + */ + private String update_time; + /** + * 任务标识 + */ + private String task_id; +} diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/service/dto/MaterialbaseDto.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/service/dto/MaterialbaseDto.java new file mode 100644 index 0000000..323f22a --- /dev/null +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/service/dto/MaterialbaseDto.java @@ -0,0 +1,99 @@ +package org.nl.wms.dump.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author zhouz + * @description / + * @date 2021-12-07 + **/ +@Data +public class MaterialbaseDto implements Serializable { + + /** + * 防止精度丢失 + */ + @JsonSerialize(using = ToStringSerializer.class) + private Long material_id; + + /** + * 物料编码 + */ + private String material_code; + + /** + * 物料名称 + */ + private String material_name; + + private String material_spec; + + private String material_model; + + private String english_name; + + private Long base_unit_id; + private String base_unit_name; + + private String approve_fileno; + + private String print_no; + + /** + * 物料分类 + */ + private Long material_type_id; + + private Long len_unit_id; + + private BigDecimal length; + + private BigDecimal width; + + private BigDecimal height; + + /** + * 计量单位 + */ + private Long weight_unit_id; + + private BigDecimal gross_weight; + + private BigDecimal net_weight; + + private Long cubage_unit_id; + + private BigDecimal cubage; + + private Long create_id; + + private String create_name; + + private String create_time; + + private Long update_optid; + + private String update_optname; + + private String update_time; + + private String is_used_time; + + /** + * 是否启用 + */ + private String is_used; + + private String is_delete; + + private String ext_id; + + private String material_height_type; + + private Long ass_unit_id; +} diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/service/impl/DumpinvServiceImpl.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/service/impl/DumpinvServiceImpl.java new file mode 100644 index 0000000..94cecef --- /dev/null +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/service/impl/DumpinvServiceImpl.java @@ -0,0 +1,352 @@ + +package org.nl.wms.dump.service.impl; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.exception.BadRequestException; +import org.nl.modules.system.util.CodeUtil; +import org.nl.utils.FileUtil; +import org.nl.utils.SecurityUtils; +import org.nl.utils.SpringContextHolder; +import org.nl.wms.dump.service.DumpinvService; +import org.nl.wms.dump.service.dto.DumpinvDto; +import org.nl.wms.pda.exception.PdaRequestException; +import org.nl.wms.sch.manage.buss.DumpTask; +import org.nl.wms.sch.service.dto.PointDto; +import org.nl.wms.sch.service.impl.PointServiceImpl; +import org.nl.wms.st.ivt.IvtChangeTypeEnum; +import org.nl.wms.st.ivt.StoreIvtServiceImpl; +import org.nl.wql.WQL; +import org.nl.wql.core.bean.WQLObject; +import org.nl.wql.util.WqlUtil; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * @author qinx + * @description 服务实现 + * @date 2022-02-15 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class DumpinvServiceImpl implements DumpinvService { + + @Override + public Map queryAll(Map whereJson, Pageable page) { + JSONObject json = WQL.getWO("QMD_ME_MATERIAL").addParam("flag", "3").pageQuery(WqlUtil.getHttpContext(page), "bill_code desc"); + + return json; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("st_buss_dumpinv"); + JSONArray arr = wo.query().getResultJSONArray(0); + List list = arr.toJavaList(DumpinvDto.class); + return list; + } + + @Override + public DumpinvDto findById(String dumpinv_id) { + WQLObject wo = WQLObject.getWQLObject("st_buss_dumpinv"); + JSONObject json = wo.query("dumpinv_id ='" + dumpinv_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) return json.toJavaObject(DumpinvDto.class); + return null; + } + + @Override + public DumpinvDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("st_buss_dumpinv"); + JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) return json.toJavaObject(DumpinvDto.class); + return null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(DumpinvDto dto) { + String currentUsername = SecurityUtils.getCurrentUsername(); + String now = DateUtil.now(); + String turnout_struct_id = dto.getTurnout_struct_id(); + String turnin_struct_id = dto.getTurnin_struct_id(); + if (StrUtil.isEmpty(turnout_struct_id)) { + throw new BadRequestException("转出仓位不能为空!"); + } + if (StrUtil.isEmpty(turnin_struct_id)) { + throw new BadRequestException("转入仓位不能为空!"); + } + JSONObject ivtJo = WQLObject.getWQLObject("st_ivt_structivt").query("struct_id='" + turnout_struct_id + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(ivtJo)) { + throw new BadRequestException("未找到库存信息"); + } + JSONObject turninObj = WQLObject.getWQLObject("sch_base_point").query("point_id='" + turnin_struct_id + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(turninObj)) { + throw new BadRequestException("转入仓位未找到"); + } + JSONObject dumpinvObj = new JSONObject(); + dumpinvObj.put("dumpinv_id", IdUtil.getSnowflake(1, 1).nextId() + ""); + dumpinvObj.put("bill_code", CodeUtil.getNewCode("PD_CODE")); + dumpinvObj.put("bill_status", "00"); + dumpinvObj.put("turnout_struct_id", dto.getTurnout_struct_id()); + dumpinvObj.put("turnout_struct_code", dto.getTurnout_struct_code()); + dumpinvObj.put("turnout_struct_name", dto.getTurnout_struct_name()); + dumpinvObj.put("turnin_struct_id", dto.getTurnin_struct_id()); + dumpinvObj.put("turnin_struct_code", dto.getTurnin_struct_code()); + dumpinvObj.put("turnin_struct_name", dto.getTurnin_struct_name()); + dumpinvObj.put("barcode", ivtJo.getString("barcode")); + dumpinvObj.put("material_id", ivtJo.getString("material_id")); + dumpinvObj.put("pcsn", ivtJo.getString("pcsn")); + dumpinvObj.put("qty_unit_id", ivtJo.getString("qty_unit_id")); + dumpinvObj.put("qty", ivtJo.getString("canuse_qty")); + dumpinvObj.put("vehicle_code", ivtJo.getString("vehicle_code")); + dumpinvObj.put("remark", dto.getRemark()); + dumpinvObj.put("is_active", "1"); + dumpinvObj.put("create_by", currentUsername); + dumpinvObj.put("create_time", now); + dumpinvObj.put("update_by", currentUsername); + dumpinvObj.put("update_time", now); + WQLObject.getWQLObject("st_buss_dumpinv").insert(dumpinvObj); + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(DumpinvDto dto) { + String currentUsername = SecurityUtils.getCurrentUsername(); + String dumpinv_id = dto.getDumpinv_id(); + String now = DateUtil.now(); + JSONObject dumpinvObj = WQLObject.getWQLObject("st_buss_dumpinv").query("dumpinv_id='" + dumpinv_id + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(dumpinvObj)) { + throw new BadRequestException("未找到该单据!"); + } + String turnout_struct_id = dto.getTurnout_struct_id(); + String turnin_struct_id = dto.getTurnin_struct_id(); + if (StrUtil.isEmpty(turnout_struct_id)) { + throw new BadRequestException("转出仓位不能为空!"); + } + if (StrUtil.isEmpty(turnin_struct_id)) { + throw new BadRequestException("转入仓位不能为空!"); + } + JSONObject ivtJo = WQLObject.getWQLObject("st_ivt_structivt").query("struct_id='" + turnout_struct_id + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(ivtJo)) { + throw new BadRequestException("未找到库存信息"); + } + JSONObject turninObj = WQLObject.getWQLObject("sch_base_point").query("point_id='" + turnin_struct_id + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(turninObj)) { + throw new BadRequestException("转入仓位未找到"); + } + + dumpinvObj.put("turnout_struct_id", dto.getTurnout_struct_id()); + dumpinvObj.put("turnout_struct_code", dto.getTurnout_struct_code()); + dumpinvObj.put("turnout_struct_name", dto.getTurnout_struct_name()); + dumpinvObj.put("turnin_struct_id", dto.getTurnin_struct_id()); + dumpinvObj.put("turnin_struct_code", dto.getTurnin_struct_code()); + dumpinvObj.put("turnin_struct_name", dto.getTurnin_struct_name()); + dumpinvObj.put("barcode", ivtJo.getString("barcode")); + dumpinvObj.put("material_id", ivtJo.getString("material_id")); + dumpinvObj.put("pcsn", ivtJo.getString("pcsn")); + dumpinvObj.put("qty_unit_id", ivtJo.getString("qty_unit_id")); + dumpinvObj.put("qty", ivtJo.getString("canuse_qty")); + dumpinvObj.put("vehicle_code", ivtJo.getString("vehicle_code")); + dumpinvObj.put("remark", dto.getRemark()); + dumpinvObj.put("is_active", "1"); + dumpinvObj.put("create_by", currentUsername); + dumpinvObj.put("create_time", now); + dumpinvObj.put("update_by", currentUsername); + dumpinvObj.put("update_time", now); + WQLObject.getWQLObject("st_buss_dumpinv").update(dumpinvObj); + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(String[] ids) { + WQLObject wo = WQLObject.getWQLObject("st_buss_dumpinv"); + for (String dumpinv_id : ids) { + wo.delete("dumpinv_id = '" + dumpinv_id + "'"); + } + } + + @Override + public void download(List all, HttpServletResponse response) throws IOException { + List> list = new ArrayList<>(); + for (DumpinvDto dumpinv : all) { + Map map = new LinkedHashMap<>(); + map.put("单据编号", dumpinv.getBill_code()); + map.put("单据状态", dumpinv.getBill_status()); + map.put("转出仓位标识", dumpinv.getTurnout_struct_id()); + map.put("转出仓位编码", dumpinv.getTurnout_struct_code()); + map.put("转出仓位名称", dumpinv.getTurnout_struct_name()); + map.put("转入仓位标识", dumpinv.getTurnin_struct_id()); + map.put("转入仓位编码", dumpinv.getTurnin_struct_code()); + map.put("转入仓位名称", dumpinv.getTurnin_struct_name()); + map.put("条形码", dumpinv.getWorkprocedure_id()); + map.put("物料标识", dumpinv.getMaterial_id()); + map.put("批次", dumpinv.getPcsn()); + map.put("数量计量单位标识", dumpinv.getQty_unit_id()); + map.put("数量", dumpinv.getQty()); + map.put("载具号", dumpinv.getVehicle_code()); + map.put("备注", dumpinv.getRemark()); + map.put("是否启用", dumpinv.getIs_active()); + map.put("是否删除", dumpinv.getIs_delete()); + map.put("创建者", dumpinv.getCreate_by()); + map.put("创建时间", dumpinv.getCreate_time()); + map.put("修改者", dumpinv.getUpdate_by()); + map.put("修改时间", dumpinv.getUpdate_time()); + list.add(map); + } + FileUtil.downloadExcel(list, response); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void crateTask(DumpinvDto dto) { + //1 生成任务 //2 加锁 // 更新状态 + String dumpinv_id = dto.getDumpinv_id(); + JSONObject dumpObj = WQLObject.getWQLObject("st_buss_DumpInv").query("dumpinv_id='" + dumpinv_id + "'").uniqueResult(0); + DumpTask task = new DumpTask(); + JSONObject taskObj = new JSONObject(); + String turnout_struct_code = dumpObj.getString("turnout_struct_code"); + String turnin_struct_code = dumpObj.getString("turnin_struct_code"); + taskObj.put("taskdtl_type", "00"); + taskObj.put("start_point_code", turnout_struct_code); + taskObj.put("next_point_code", turnin_struct_code); + taskObj.put("buss_area_type", "01"); + taskObj.put("vehicle_code", dumpObj.getString("vehicle_code")); + String task_code = CodeUtil.getNewCode("TASK_CODE"); + String task_id = task.createTask(taskObj); + //加锁 + WQLObject pointTable = WQLObject.getWQLObject("sch_base_point"); + JSONObject outPointObj = pointTable.query("point_code ='" + turnout_struct_code + "'").uniqueResult(0); + JSONObject InPointObj = pointTable.query("point_code ='" + turnin_struct_code + "'").uniqueResult(0); + outPointObj.put("lock_type", "01"); + InPointObj.put("lock_type", "01"); + pointTable.update(outPointObj); + pointTable.update(InPointObj); + //更新转储单的状态 + dumpObj.put("bill_status", "01"); + dumpObj.put("task_code", task_code); + dumpObj.put("task_id", task_id); + + WQLObject.getWQLObject("st_buss_DumpInv").update(dumpObj); + } + + @Override + public void finshTask(DumpinvDto dto) { + String task_id = dto.getTask_id(); + if (StrUtil.isEmpty(task_id)) { + throw new BadRequestException("任务标志不能为空!"); + } + DumpTask task = new DumpTask(); + task.forceFinish(task_id); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void dis(Map map) { + String billdis_id = (String) map.get("billdis_id"); + String start_point_code = (String) map.get("turnout_struct_code"); + String next_point_code = (String) map.get("turnin_struct_code"); + if (StrUtil.isEmpty(billdis_id)) { + throw new PdaRequestException("分配标志不能为空!"); + } + if (StrUtil.isEmpty(next_point_code)) { + throw new PdaRequestException("终点不能为空!"); + } + if (StrUtil.isEmpty(start_point_code)) { + throw new PdaRequestException("起点不能为空!"); + } + JSONObject disObj = WQLObject.getWQLObject("st_buss_IOStoreDis").query("billdis_id='" + billdis_id + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(disObj)) { + throw new PdaRequestException("未找到分配记录!"); + } + //根据起点去找起点区域 + WQLObject pointtable = WQLObject.getWQLObject("sch_base_point"); + PointServiceImpl pointService = SpringContextHolder.getBean(PointServiceImpl.class); + PointDto nextPointDto = pointService.findByCode(next_point_code); + if (ObjectUtil.isNull(nextPointDto)) { + throw new PdaRequestException("未找到可用点位:" + next_point_code); + } + PointDto startPointDto = pointService.findByCode(start_point_code); + if (ObjectUtil.isNull(startPointDto)) { + throw new PdaRequestException("未找到可用点位:" + start_point_code); + } + + String startArea = startPointDto.getArea_type(); + String nextArea = nextPointDto.getArea_type(); + disObj.put("start_area_type", startArea); + disObj.put("next_area_type", nextArea); + disObj.put("start_point_code", start_point_code); + disObj.put("next_point_code", next_point_code); + disObj.put("is_finishtask", "1"); + WQLObject.getWQLObject("st_buss_IOStoreDis").update(disObj); + //增加库存 + JSONObject param = new JSONObject(); + param.put("material_id", disObj.getString("material_id")); + param.put("bill_id", disObj.getString("bill_id")); + param.put("qty_unit_id", disObj.getString("qty_unit_id")); + param.put("pcsn", disObj.getString("pcsn")); + param.put("change_qty", disObj.getString("realassign_qty")); + param.put("vehicle_code", disObj.getString("vehicle_code")); + param.put("barcode", disObj.getString("barcode")); + param.put("struct_id", nextPointDto.getPoint_id()); + StoreIvtServiceImpl ivtService = new StoreIvtServiceImpl(); + ivtService.addIvtFlow(param, IvtChangeTypeEnum.ADD_IVT_AND_CAN_USE); + //更新主表跟明细表 + String billdtl_id = disObj.getString("billdtl_id"); + String bill_id = disObj.getString("bill_id"); + WQLObject dtlTab = WQLObject.getWQLObject("st_buss_IOStoreDtl"); + WQLObject mstTab = WQLObject.getWQLObject("st_buss_IOStoreMst"); + JSONObject dtlObj = dtlTab.query("billdtl_id='" + billdtl_id + "'").uniqueResult(0); + JSONObject disjoo = WQLObject.getWQLObject("st_buss_iostoredis").query("billdtl_id='" + billdtl_id + "' and is_finishtask<>'1' and is_delete<>'1'").uniqueResult(0); + //假如所有的分配都完成了任务,更新明细表 + double qty = Double.valueOf(dtlObj.getString("qty")); + double assign_qty = Double.valueOf(dtlObj.getString("assign_qty")); + if (ObjectUtil.isEmpty(disjoo) && (qty == assign_qty)) { + dtlObj.put("bill_status", "40"); + dtlObj.put("is_can_back", "1"); + dtlTab.update(dtlObj); + } + //该表主表的状态 + if (StrUtil.isNotEmpty(bill_id)) { + JSONObject mstObj = mstTab.query("bill_id='" + bill_id + "'").uniqueResult(0); + JSONObject dtlObj1 = dtlTab.query("bill_id='" + bill_id + "' and bill_status<>'40'").uniqueResult(0); + if (ObjectUtil.isNull(dtlObj1)) { + mstObj.put("bill_status", "40"); + mstTab.update(mstObj); + } + } + //更新点位状态 + //解锁仓位,托盘信息,回写到点位上去 + String vehicle_code = disObj.getString("vehicle_code"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + JSONObject endpointObj = pointTab.query("point_code='" + next_point_code + "'").uniqueResult(0); + endpointObj.put("lock_type", "00"); + endpointObj.put("point_status", "02"); + endpointObj.put("vehicle_code", vehicle_code); + pointTab.update(endpointObj); + + JSONObject startPointObj = pointTab.query("point_code='" + start_point_code + "'").uniqueResult(0); + startPointObj.put("lock_type", "00"); + startPointObj.put("point_status", "00"); + startPointObj.put("vehicle_code", ""); + pointTab.update(startPointObj); + + } +} diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/service/impl/MaterialbaseServiceImpl.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/service/impl/MaterialbaseServiceImpl.java new file mode 100644 index 0000000..00cfd5d --- /dev/null +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/service/impl/MaterialbaseServiceImpl.java @@ -0,0 +1,58 @@ + +package org.nl.wms.dump.service.impl; + + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.dump.service.MaterialbaseService; +import org.nl.wql.WQL; +import org.nl.wql.util.WqlUtil; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author zhouz + * @description 服务实现 + * @date 2021-12-07 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class MaterialbaseServiceImpl implements MaterialbaseService { + + + @Override + public Map queryAll(Map whereJson, Pageable page) { + HashMap map = new HashMap<>(); + map.put("flag", "1"); + String search = MapUtil.getStr(whereJson, "search"); + if (StrUtil.isNotEmpty(search)){ + map.put("search", "%" + search + "%"); + } + + JSONObject jo = WQL.getWO("QMD_ME_MATERIAL").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "struct_code"); + return jo; + } + + @Override + public Map queryEmptyStruct(Map whereJson, Pageable page) { + HashMap map = new HashMap<>(); + map.put("flag", "2"); + String sect_code = MapUtil.getStr(whereJson,"sect_code"); + map.put("sect_code", sect_code); + String search = MapUtil.getStr(whereJson, "search"); + if (StrUtil.isNotEmpty(search)){ + map.put("search", "%" + search + "%"); + } + JSONObject jo = WQL.getWO("QMD_ME_MATERIAL").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "sect_code,struct_code"); + return jo; + } + + +} diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/wql/QMD_ME_MATERIAL.wql b/wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/wql/QMD_ME_MATERIAL.wql new file mode 100644 index 0000000..22ab731 --- /dev/null +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/dump/wql/QMD_ME_MATERIAL.wql @@ -0,0 +1,133 @@ +[交易说明] + 交易名: 物料分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.search TYPEAS s_string + 输入.class_code TYPEAS s_string + 输入.idssql TYPEAS f_string + 输入.classIds TYPEAS f_string + 输入.sect_code TYPEAS s_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + struct.struct_code, + struct.struct_name, + material.material_code, + material.material_name, + struct.struct_id, + ivt.canuse_qty, + ivt.ivt_qty, + ivt.vehicle_code, + ivt.pcsn + FROM + st_ivt_structivt ivt + LEFT JOIN st_ivt_structattr struct ON ivt.struct_id = struct.struct_id + LEFT JOIN md_me_material material ON material.material_id = ivt.material_id + LEFT JOIN sch_base_point point ON point.point_id = struct.struct_id + WHERE + 1 = 1 + AND point.point_status = '02' + AND point.lock_type = '00' + AND point.is_used = '1' + OPTION 输入.search <> "" + ( + struct.struct_code like 输入.search + OR + material.material_name like 输入.search + or + material.material_code like 输入.search + or + ivt.vehicle_code like 输入.search + ) + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF + + +IF 输入.flag = "2" + PAGEQUERY + SELECT + struct.*, + sect.sect_code, + sect.sect_name + FROM + st_ivt_structattr struct + LEFT JOIN st_ivt_sectattr sect ON sect.sect_id = struct.sect_id + LEFT JOIN sch_base_point point ON point.point_id = struct.struct_id + WHERE + point.area_type IN ( '01', '02', '10' ) + AND point_status = '00' + AND point.is_used = '1' + AND lock_type = '00' + AND vehicle_code = '' + OPTION 输入.sect_code <> "" + sect.sect_code = 输入.sect_code + ENDOPTION + OPTION 输入.search <> "" + ( + point.point_code like 输入.search + OR + point.point_name like 输入.search + ) + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF + +IF 输入.flag = "3" + PAGEQUERY + SELECT + unit.unit_name as qty_unit_uuid_name, + dump.*, + material.material_code, + material.material_name , + case dump.bill_status when '00' then '新增' + when '01' then '生成任务' + when '02' then '任务执行中' + when '03' then '完成' + else '' end as bill_status_name + FROM + st_buss_dumpinv dump + LEFT JOIN md_me_material material ON dump.material_id = material.material_id + left join md_pb_measureunit unit on unit.unit_id =dump.qty_unit_id + ENDSELECT + ENDPAGEQUERY + ENDIF + + diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java index d6e6046..1aa92c8 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java @@ -82,4 +82,10 @@ public class AcsToWmsController { return new ResponseEntity<>(HttpStatus.OK); } + @PostMapping("/status") + @Log("ACS给WMS反馈任务状态") + @ApiOperation("ACS给WMS反馈任务状态") + public ResponseEntity receiveTaskStatusAcs(@RequestBody String string) { + return new ResponseEntity<>(acsToWmsService.receiveTaskStatusAcs(string), HttpStatus.OK); + } } diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java index ba16d14..ef0b57a 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java @@ -62,5 +62,14 @@ public interface AcsToWmsService { */ void sureProduceTask(Map jsonObject); + /** + * ACS客户端--->WMS服务端 + * ACS向WMS反馈任务状态 + * + * @param jsonObject 条件 + * @return Map + */ + + Map receiveTaskStatusAcs(String string); } diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java index 39d3247..b1f74c1 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java @@ -1,7 +1,6 @@ package org.nl.wms.ext.acs.service; import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; import java.util.Map; diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java index 897f4bf..a1fe020 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -14,15 +15,21 @@ import org.nl.utils.SecurityUtils; import org.nl.wms.WorkProcedureEnum; import org.nl.wms.database.service.dto.VehicleDto; import org.nl.wms.ext.acs.service.AcsToWmsService; +import org.nl.wms.sch.manage.TaskStatusEnum; import org.nl.wms.sch.manage.buss.CallEmptyVehicleTask; import org.nl.wms.sch.manage.buss.CallMaterialTask; import org.nl.wms.sch.manage.buss.SendEmptyVehicleTask; import org.nl.wms.sch.manage.buss.SendMaterialTask; +import org.nl.wms.sch.service.TaskService; +import org.nl.wms.sch.service.dto.TaskDto; import org.nl.wql.WQL; import org.nl.wql.core.bean.WQLObject; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.Map; @Service @@ -33,6 +40,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { private final CallMaterialTask callMaterialTask; private final SendEmptyVehicleTask sendEmptyVehicleTask; private final CallEmptyVehicleTask callEmptyVehicleTask; + private final TaskService taskService; @Override @@ -306,8 +314,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { String producetask_code = (String) jsonObject.get("producetask_code"); String device_code = (String) jsonObject.get("device_code"); String material_code = (String) jsonObject.get("material_code"); - String qty = (String) jsonObject.get("qty"); - String weight = (String) jsonObject.get("weight"); + String qty = String.valueOf(jsonObject.get("qty")); String type = (String) jsonObject.get("type"); if (StrUtil.isEmpty(type)) { throw new BadRequestException("类型不能为空!"); @@ -341,18 +348,80 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { if (!StrUtil.equals(materiObj.getString("material_id"), taskObj.getString("material_id"))) { throw new BadRequestException("物料标识不一样!"); } - taskObj.put("producetask_status", "03"); + taskObj.put("producetask_status", "04"); } if (StrUtil.equals("2", type)) { - taskObj.put("producetask_status", "04"); - } - if (StrUtil.equals("3", type)) { taskObj.put("producetask_status", "05"); + taskObj.put("real_qty",qty); } taskTable.update(taskObj); } + @Override + public Map receiveTaskStatusAcs(String string) { + JSONArray array = JSONArray.parseArray(string); + //返回处理失败的任务 + JSONArray errArr = new JSONArray(); + for (int i = 0; i < array.size(); i++) { + JSONObject row = array.getJSONObject(i); + String task_id = row.getString("ext_task_uuid"); + row.put("task_id",task_id); + TaskDto taskDto = taskService.findById(task_id); + String processing_class = taskDto.getHandle_class(); + //1:执行中,2:完成 ,3:acs取消 + String acs_task_status = row.getString("task_status"); + String message = ""; + String status = ""; + if ("1".equals(acs_task_status)) { + status = TaskStatusEnum.EXECUTING.getCode(); + } + if ("2".equals(acs_task_status)) { + status = TaskStatusEnum.FINISHED.getCode(); + } + // 任务处理类 + try { + Class clz = Class.forName(processing_class); + Object obj = clz.newInstance(); + // 调用每个任务类的forceFinishInst()强制结束方法 + Method m = obj.getClass().getDeclaredMethod("updateTaskStatus", JSONObject.class, String.class); + m.invoke(obj, row, status); + } catch (InvocationTargetException e) { + e.printStackTrace(); + //空指针 + if (ObjectUtil.isNull(e.getTargetException().getMessage())) { + message = e.getTargetException().toString(); + } else { + message = e.getTargetException().getMessage(); + } + log.info("任务状态更新失败:{}", message); + + JSONObject json = new JSONObject(); + json.put("task_id", task_id); + json.put("message", message); + errArr.add(json); + + } catch (Exception e) { + e.printStackTrace(); + message = e.getMessage(); + log.info("任务状态更新失败:{}", message); + + JSONObject json = new JSONObject(); + json.put("task_id", task_id); + json.put("message", message); + errArr.add(json); + + } + } + + JSONObject result = new JSONObject(); + result.put("status", HttpStatus.OK.value()); + result.put("message", "任务状态反馈成功!"); + result.put("data", new JSONObject()); + result.put("errArr", errArr); + return result; + } + private JSONObject getProduceInfoByCode(String code) { //根据 设备点位去找生产任务信息 //1 根据点位去找设备,去找对应的设备信息 diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/callEmpty/rest/CallEmptyController.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/callEmpty/rest/CallEmptyController.java index bfa7eaa..4ce15fe 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/callEmpty/rest/CallEmptyController.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/callEmpty/rest/CallEmptyController.java @@ -2,14 +2,12 @@ package org.nl.wms.pda.callEmpty.rest; -import com.alibaba.fastjson.JSONArray; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.annotation.Log; import org.nl.wms.pda.callEmpty.service.CallEmptyService; -import org.nl.wms.pda.sendMaterial.service.SendMaterialService; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/callMaterial/service/impl/CallMaterialServiceImpl.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/callMaterial/service/impl/CallMaterialServiceImpl.java index 2988934..4cb364c 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/callMaterial/service/impl/CallMaterialServiceImpl.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/callMaterial/service/impl/CallMaterialServiceImpl.java @@ -1,5 +1,8 @@ package org.nl.wms.pda.callMaterial.service.impl; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; @@ -7,17 +10,25 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.formula.functions.T; import org.nl.exception.BadRequestException; +import org.nl.modules.system.util.CodeUtil; +import org.nl.utils.SecurityUtils; +import org.nl.wms.WorkProcedureEnum; +import org.nl.wms.common.StructFindUtil; import org.nl.wms.pda.callMaterial.service.CallMaterialService; import org.nl.wms.pda.exception.PdaRequestException; +import org.nl.wms.sch.manage.AreaEnum; import org.nl.wms.sch.manage.buss.CallEmptyVehicleTask; import org.nl.wms.sch.manage.buss.CallMaterialTask; +import org.nl.wms.sch.manage.buss.DumpTask; import org.nl.wql.WQL; import org.nl.wql.core.bean.WQLObject; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RequestBody; +import java.security.Security; import java.util.Map; @Service @@ -28,7 +39,7 @@ public class CallMaterialServiceImpl implements CallMaterialService { @Override public Map queryPoint(Map jsonObject) { - //只查人工处理位 + //只查人工处理位 跟压机上料位置05空出来的位置 JSONArray pointArr = WQL.getWO("QPADSTSETSERVICE").addParam("flag", "16").process().getResultJSONArray(0); JSONObject returnjo = new JSONObject(); returnjo.put("code", "1"); @@ -45,19 +56,93 @@ public class CallMaterialServiceImpl implements CallMaterialService { if (StrUtil.isEmpty(is_full)) { throw new PdaRequestException("是否满拖不能为空!"); } - JSONObject jsonObject = new JSONObject(); - //叫料出库 - jsonObject.put("next_point_code", next_point_code); - jsonObject.put("create_mode", "03"); - //批次 物料,客户要从排产单里面去取 - jsonObject.put("pcsn", "pcsn"); - JSONObject produceInfoByCode = this.getProduceInfoByCode(next_point_code); - jsonObject.put("material_id", produceInfoByCode.getString("material_id")); - jsonObject.put("cust_id", produceInfoByCode.getString("cust_id")); - jsonObject.put("stewing_time", produceInfoByCode.getString("stewing_time")); - jsonObject.put("producetask_id", produceInfoByCode.getString("producetask_id")); - jsonObject.put("is_full", is_full); - callMaterialTask.createTask((JSONObject) JSON.toJSON(jsonObject)); + //假如是压机上料位,则走转储的功能 + WQLObject point_Table = WQLObject.getWQLObject("sch_base_point"); + JSONObject pointObj = point_Table.query("point_code='" + next_point_code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(pointObj)) { + throw new BadRequestException("未找到点位编码为" + next_point_code + "'的信息!"); + } + String point_type = pointObj.getString("point_type"); + //如果是压机上料位置则走转储的流程 + if (StrUtil.equals(point_type, "05")) { + //查询当前压机对应的排产单的物料信息是 + JSONObject TaskObj = WQLObject.getWQLObject("PDM_MG_produceTask").query("device_id='" + pointObj.getString("device_id") + "' and producetask_status in ('02','03','04') and is_delete='0'").uniqueResult(0); + if (ObjectUtil.isEmpty(TaskObj)) { + throw new BadRequestException("未找到该点位设备的工单信息!"); + } + String material_id = TaskObj.getString("material_id"); + String startArea_type = AreaEnum.KLHJ.getCode(); + JSONObject param1 = new JSONObject(); + param1.put("material_id", material_id); + param1.put("area_type", startArea_type); + param1.put("workprocedure_id", WorkProcedureEnum.HNGX.getId()); + param1.put("is_full", is_full); + JSONObject outStructObj = StructFindUtil.getOutStruct(param1); + if (ObjectUtil.isEmpty(outStructObj)) { + throw new BadRequestException("未找到合适的出库仓位!"); + } + String qty = outStructObj.getString("canuse_qty"); + String qty_unit_id = outStructObj.getString("qty_unit_id"); + + String start_point_code = outStructObj.getString("struct_code"); + String vehicle_code = outStructObj.getString("vehicle_code"); + //创建转储单据 + String task_id = IdUtil.getSnowflake(1, 1).nextIdStr(); + String task_code = CodeUtil.getNewCode("TASK_CODE"); + JSONObject dump = new JSONObject(); + dump.put("dumpinv_id", IdUtil.getSnowflake(1, 1).nextId()); + dump.put("bill_code", CodeUtil.getNewCode("ZC_BILL_CODE")); + dump.put("bill_status", "01"); + dump.put("turnout_struct_id", outStructObj.getString("struct_id")); + dump.put("turnout_struct_code", outStructObj.getString("struct_code")); + dump.put("turnout_struct_name", outStructObj.getString("struct_name")); + dump.put("turnin_struct_id", pointObj.getString("point_id")); + dump.put("turnin_struct_code", pointObj.getString("point_code")); + dump.put("turnin_struct_name", pointObj.getString("point_name")); + dump.put("workprocedure_id", outStructObj.getString("workprocedure_id")); + dump.put("material_id", outStructObj.getString("material_id")); + dump.put("task_id", task_id); + dump.put("task_code", task_code); + dump.put("pcsn", outStructObj.getString("pcsn")); + dump.put("qty_unit_id", outStructObj.getString("qty_unit_id")); + dump.put("qty", outStructObj.getString("canuse_qty")); + dump.put("vehicle_code", outStructObj.getString("vehicle_code")); + dump.put("is_active", "1"); + dump.put("is_delete", "0"); + dump.put("create_by", SecurityUtils.getCurrentUserId()); + dump.put("create_time", DateUtil.now()); + WQLObject.getWQLObject("st_buss_dumpinv").insert(dump); + DumpTask task = new DumpTask(); + JSONObject jo = new JSONObject(); + jo.put("task_id", task_id); + jo.put("start_point_code", start_point_code); + jo.put("next_point_code", next_point_code); + jo.put("vehicle_code", vehicle_code); + task.createTask(jo); + //锁定起点跟终点 + WQLObject point_table = WQLObject.getWQLObject("sch_base_point"); + JSONObject outpoint = point_table.query("point_code='" + outStructObj.getString("struct_code") + "'").uniqueResult(0); + outpoint.put("lock_type", "01"); + JSONObject inpoint = point_table.query("point_code='" + pointObj.getString("point_code") + "'").uniqueResult(0); + inpoint.put("lock_type", "01"); + point_table.update(outpoint); + + } else { + JSONObject jsonObject = new JSONObject(); + //叫料出库 + jsonObject.put("next_point_code", next_point_code); + jsonObject.put("create_mode", "03"); + //批次 物料,客户要从排产单里面去取 + jsonObject.put("pcsn", "pcsn"); + JSONObject produceInfoByCode = this.getProduceInfoByCode(next_point_code); + jsonObject.put("material_id", produceInfoByCode.getString("material_id")); + jsonObject.put("cust_id", produceInfoByCode.getString("cust_id")); + jsonObject.put("stewing_time", produceInfoByCode.getString("stewing_time")); + jsonObject.put("producetask_id", produceInfoByCode.getString("producetask_id")); + jsonObject.put("is_full", is_full); + callMaterialTask.createTask((JSONObject) JSON.toJSON(jsonObject)); + } + JSONObject returnjo = new JSONObject(); returnjo.put("code", "1"); returnjo.put("desc", "操作成功!"); diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/login/wql/QPADSTSETSERVICE.wql b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/login/wql/QPADSTSETSERVICE.wql index 1a88049..1ab397f 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/login/wql/QPADSTSETSERVICE.wql +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/login/wql/QPADSTSETSERVICE.wql @@ -486,6 +486,22 @@ sch_base_point point WHERE point_name LIKE '人工处理位%' + or point_type='05' ENDSELECT ENDQUERY - ENDIF \ No newline at end of file + ENDIF + + IF 输入.flag = "17" + QUERY + SELECT + point.point_id, + point.point_code, + point.point_name + FROM + sch_base_point point + WHERE + area_type ='01' + and point_type in ('03','05') + ENDSELECT + ENDQUERY + ENDIF \ No newline at end of file diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/pressout/rest/PressOutController.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/pressout/rest/PressOutController.java new file mode 100644 index 0000000..31ec68f --- /dev/null +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/pressout/rest/PressOutController.java @@ -0,0 +1,47 @@ + +package org.nl.wms.pda.pressout.rest; + + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.annotation.Log; +import org.nl.wms.pda.pressout.service.PressurelOutService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +/** + * @author ldjun + * @date 2021-07-26 + **/ +@RestController +@RequiredArgsConstructor +@Api(tags = "手持盘点单接口管理") +@RequestMapping("/api/pda") +@Slf4j +public class PressOutController { + + private final PressurelOutService pdaService; + + @PostMapping("/pressure/queryPoint") + @Log("查询压制机上料位置的点位") + @ApiOperation("查询压制机上料位置的点位") + public ResponseEntity queryPoint(@RequestBody Map param) { + return new ResponseEntity<>(pdaService.queryPoint(param), HttpStatus.OK); + } + + @PostMapping("/pressure/confirm") + @Log("发送出库请求确认") + @ApiOperation("发送出库请求确认") + public ResponseEntity bussConfirm(@RequestBody Map param) { + return new ResponseEntity<>(pdaService.bussConfirm(param), HttpStatus.OK); + } + +} diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/pressout/service/PressurelOutService.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/pressout/service/PressurelOutService.java new file mode 100644 index 0000000..89e8ecb --- /dev/null +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/pressout/service/PressurelOutService.java @@ -0,0 +1,16 @@ +package org.nl.wms.pda.pressout.service; + +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.Map; + +public interface PressurelOutService { + Map queryPoint(Map jsonObject); + /** + * 任务请求确认 + * @param param 条件 + * @return Map + * + */ + Map bussConfirm(@RequestBody Map param); +} diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/pressout/service/impl/PressureOutServiceImpl.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/pressout/service/impl/PressureOutServiceImpl.java new file mode 100644 index 0000000..31ca13b --- /dev/null +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/pressout/service/impl/PressureOutServiceImpl.java @@ -0,0 +1,109 @@ +package org.nl.wms.pda.pressout.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.exception.BadRequestException; +import org.nl.modules.system.util.CodeUtil; +import org.nl.utils.SecurityUtils; +import org.nl.wms.WorkProcedureEnum; +import org.nl.wms.common.StructFindUtil; +import org.nl.wms.pda.exception.PdaRequestException; +import org.nl.wms.pda.pressout.service.PressurelOutService; +import org.nl.wms.sch.manage.AreaEnum; +import org.nl.wms.sch.manage.BillTypeEnum; +import org.nl.wms.sch.manage.buss.CallMaterialTask; +import org.nl.wms.sch.manage.buss.DumpTask; +import org.nl.wms.st.ivt.IvtChangeTypeEnum; +import org.nl.wms.st.ivt.StoreIvtServiceImpl; +import org.nl.wql.WQL; +import org.nl.wql.core.bean.WQLObject; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.Map; + +@Service +@RequiredArgsConstructor +@Slf4j +public class PressureOutServiceImpl implements PressurelOutService { + private final CallMaterialTask callMaterialTask; + + @Override + public Map queryPoint(Map jsonObject) { + //只查人工处理位 跟压机上料位置05空出来的位置 + JSONArray pointArr = WQL.getWO("QPADSTSETSERVICE").addParam("flag", "17").process().getResultJSONArray(0); + JSONObject returnjo = new JSONObject(); + returnjo.put("code", "1"); + returnjo.put("desc", "操作成功!"); + returnjo.put("result", pointArr); + return returnjo; + } + + @Override + @Transactional + public Map bussConfirm(@RequestBody Map param) { + String point_code = param.get("point_code"); + String point_id = param.get("point_id"); + if (StrUtil.isEmpty(point_id)) { + throw new BadRequestException("请选择一个点位"); + } + WQLObject ivt_Table = WQLObject.getWQLObject("st_ivt_structivt"); + //查询改点位有没有库存 + JSONObject ivtObj = ivt_Table.query("struct_id = '" + point_id + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(ivtObj)) { + throw new BadRequestException("点位为'" + point_code + "' 未找到库存,不能进行出库操作!"); + } + //创建出库单据 + JSONObject iosObj = new JSONObject(); + String iostorinv_id = IdUtil.getSnowflake(1, 1).nextId() + ""; + iosObj.put("iostorinv_id", iostorinv_id); + iosObj.put("bill_code", CodeUtil.getNewCode("OUT_STORE_CODE")); + iosObj.put("io_type", "1"); + iosObj.put("bill_type", BillTypeEnum.YZCK.getCode()); + iosObj.put("workprocedure_id", WorkProcedureEnum.YZGX.getId()); + iosObj.put("ivt_workprocedure_id", ivtObj.getString("workprocedure_id")); + iosObj.put("material_id", ivtObj.getString("material_id")); + iosObj.put("vehicle_code", ivtObj.getString("vehicle_code")); + iosObj.put("qty", ivtObj.getString("canuse_qty")); + iosObj.put("qty_unit_id", ivtObj.getString("qty_unit_id")); + //默认是分配状态 + iosObj.put("bill_status", "50"); + iosObj.put("start_point_code", point_code); + iosObj.put("end_point_code", ""); + iosObj.put("start_area", AreaEnum.KLHJ); + iosObj.put("end_area", ""); + iosObj.put("cust_id", ""); + iosObj.put("create_mode", "03"); + iosObj.put("task_id", ""); + iosObj.put("pcsn", ivtObj.getString("pcsn")); + iosObj.put("create_id", SecurityUtils.getCurrentUserId()); + iosObj.put("create_name", SecurityUtils.getNickName()); + iosObj.put("create_time", DateUtil.now()); + WQLObject.getWQLObject("ST_IVT_workProcedureIOS").insert(iosObj); + //扣除库存 + JSONObject jo = new JSONObject(); + jo.put("material_id", ivtObj.getString("material_id")); + jo.put("bill_id", iostorinv_id); + jo.put("qty_unit_id", ivtObj.getString("qty_unit_id")); + jo.put("pcsn", ivtObj.getString("pcsn")); + jo.put("change_qty", ivtObj.getString("canuse_qty")); + jo.put("vehicle_code", ivtObj.getString("vehicle_code")); + jo.put("workprocedure_id", ivtObj.getString("workprocedure_id")); + jo.put("struct_id", point_id); + StoreIvtServiceImpl ivtService = new StoreIvtServiceImpl(); + ivtService.addIvtFlow(jo, IvtChangeTypeEnum.SUB_IVT_AND_CAN_USE); + JSONObject returnjo = new JSONObject(); + returnjo.put("code", "1"); + returnjo.put("desc", "操作成功!"); + return returnjo; + } + +} diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/sendMaterial/service/impl/SendMaterialServiceImpl.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/sendMaterial/service/impl/SendMaterialServiceImpl.java index 1a6a009..05f03b3 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/sendMaterial/service/impl/SendMaterialServiceImpl.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/sendMaterial/service/impl/SendMaterialServiceImpl.java @@ -1,7 +1,5 @@ package org.nl.wms.pda.sendMaterial.service.impl; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; @@ -10,20 +8,14 @@ import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.exception.BadRequestException; -import org.nl.modules.system.service.UserService; -import org.nl.utils.SecurityUtils; -import org.nl.wms.database.service.MaterialService; -import org.nl.wms.pda.sendMaterial.service.SendMaterialService; import org.nl.wms.pda.exception.PdaRequestException; +import org.nl.wms.pda.sendMaterial.service.SendMaterialService; import org.nl.wms.sch.manage.buss.SendMaterialTask; import org.nl.wql.core.bean.WQLObject; -import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RequestBody; -import java.math.BigDecimal; -import java.util.HashMap; import java.util.Map; @Service diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/ProducetaskServiceImpl.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/ProducetaskServiceImpl.java index 569825c..a81fe2b 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/ProducetaskServiceImpl.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/ProducetaskServiceImpl.java @@ -276,7 +276,7 @@ public class ProducetaskServiceImpl implements ProducetaskService { String producetask_id = param.getString("producetask_id"); WQLObject wo = WQLObject.getWQLObject("pdm_mg_producetask"); JSONObject taskObj= WQL.getWO("PDM_ProduceTask_01").addParam("flag", "3").addParam("producetask_id", producetask_id).process().uniqueResult(0); - + taskObj.put("product_code","wms"); WmsToAcsService wmsToAcsService = SpringContextHolder.getBean(WmsToAcsService.class); JSONArray arr = new JSONArray(); arr.add(taskObj); diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pdm/wql/PDM_ProduceTask_01.wql b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pdm/wql/PDM_ProduceTask_01.wql index 1ce8e8c..232da00 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pdm/wql/PDM_ProduceTask_01.wql +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pdm/wql/PDM_ProduceTask_01.wql @@ -109,6 +109,8 @@ QUERY SELECT task.*, + cust.cust_code, + cust.cust_name, device.device_code, device.device_name, material.material_code, @@ -119,8 +121,9 @@ pdm_mg_producetask task LEFT JOIN pdm_base_device device ON task.device_id = device.device_id LEFT JOIN md_me_material material ON material.material_id = task.material_id + LEFT JOIN md_cs_customerbase cust ON cust.cust_id = task.cust_id WHERE - 1=1 + 1 =1 OPTION 输入.producetask_id <> "" (task.producetask_id = 输入.producetask_id) ENDOPTION diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java index 2a1d833..e74c5c8 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java @@ -48,7 +48,7 @@ public abstract class AbstractAcsTask { for (int i = 0, j = tasks.size(); i < j; i++) { JSONObject json = tasks.getJSONObject(i); AcsTaskDto taskDto = new AcsTaskDto(); - taskDto.setTask_id(json.getString("task_id")); + taskDto.setExt_task_uuid(json.getString("task_id")); taskDto.setTask_code(json.getString("task_code")); taskDto.setTask_type("1"); taskDto.setRoute_plan_code("normal"); @@ -114,7 +114,7 @@ public abstract class AbstractAcsTask { for (int i = 0, j = arr.size(); i < j; i++) { JSONObject json = arr.getJSONObject(i); AcsTaskDto taskDto = new AcsTaskDto(); - taskDto.setTask_id(json.getString("task_id")); + taskDto.setExt_task_uuid(json.getString("task_id")); taskDto.setTask_code(json.getString("task_code")); taskDto.setTask_type("1"); taskDto.setRoute_plan_code("normal"); diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/AreaEnum.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/AreaEnum.java index f599060..f8f4e00 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/AreaEnum.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/AreaEnum.java @@ -7,7 +7,7 @@ package org.nl.wms.sch.manage; */ public enum AreaEnum { KLHJ("01", "困料货架"), - CYHJ("02", "出窑货架()"), + CYHJ("02", "入窑暂存"), CYZC("03", "出窑暂存区"), BZZC("04", "包装暂存区"), HNQY("21", "混碾区域"), @@ -15,7 +15,9 @@ public enum AreaEnum { YYJLZ("23", "液压机料盅架"), YQU("24", "窑区域"), KGTDDQ("25", "空钢托堆叠区"), - ZDCDX("26", "自动柴垛线"); + ZDCDX("26", "自动柴垛线"), + RGCPQ("26", "人工拆盘区域"), + BZQ("26", "包装区"); private final String name; private final String code; diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/DumpTask.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/DumpTask.java new file mode 100644 index 0000000..0aac09e --- /dev/null +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/DumpTask.java @@ -0,0 +1,136 @@ +package org.nl.wms.sch.manage.buss; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import org.nl.exception.BadRequestException; +import org.nl.modules.system.util.CodeUtil; +import org.nl.utils.SecurityUtils; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wql.core.bean.WQLObject; +import org.springframework.transaction.annotation.Transactional; + +/** + * 入库任务生成 + */ +public class DumpTask extends AbstractAcsTask { + private final String THIS_CLASS = DumpTask.class.getName(); + + @Transactional + @Override + public void updateTaskStatus(JSONObject taskObj, String status) { + /** + *改变任务状态 + **/ + String task_id = taskObj.getString("task_id"); + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); + JSONObject jsonTask = taskTab.query("task_id='" + task_id + "'").uniqueResult(0); + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + //更新任务状态为执行中 + jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + //更新转储表的状态 02 + JSONObject dumpObj = WQLObject.getWQLObject("st_buss_dumpinv").query("task_id='" + task_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(dumpObj)) { + dumpObj.put("bill_status", "02"); + } + WQLObject.getWQLObject("st_buss_dumpinv").update(dumpObj); + } + + if (TaskStatusEnum.FINISHED.getCode().equals(status)) { + //更新转储单的状态 + JSONObject dumpObj = WQLObject.getWQLObject("st_buss_dumpinv").query("task_id='" + task_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(dumpObj)) { + dumpObj.put("bill_status", "03"); + } + WQLObject.getWQLObject("st_buss_dumpinv").update(dumpObj); + //解锁 + WQLObject pointTable = WQLObject.getWQLObject("sch_base_point"); + String start_point_code = jsonTask.getString("start_point_code"); + String next_point_code = jsonTask.getString("next_point_code"); + JSONObject outPointObj = pointTable.query("point_code ='" + start_point_code + "'").uniqueResult(0); + JSONObject InPointObj = pointTable.query("point_code ='" + next_point_code + "'").uniqueResult(0); + InPointObj.put("lock_type", "00"); + InPointObj.put("point_status", "02"); + InPointObj.put("vehicle_code", outPointObj.getString("vehicle_code")); + + outPointObj.put("lock_type", "00"); + outPointObj.put("point_status", "00"); + outPointObj.put("vehicle_code", ""); + + + pointTable.update(outPointObj); + pointTable.update(InPointObj); + //更新库存信息 + WQLObject ivtTable = WQLObject.getWQLObject("st_ivt_structIvt"); + JSONObject ivtObj = ivtTable.query("struct_id='" + outPointObj.getString("point_id") + "'").uniqueResult(0); + ivtObj.put("struct_id", InPointObj.getString("point_id")); + ivtTable.update(ivtObj); + + jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + } + + } + + @Override + public void findStartPoint() { + + } + + @Transactional + @Override + public void findNextPoint() { + } + + @Override + public String createTask(JSONObject form) { + JSONObject taskObj = new JSONObject(); + //申请任务的时候ACS会传任务标识 + if (StrUtil.isNotEmpty(form.getString("task_id"))) { + taskObj.put("task_id", form.getString("task_id")); + } else { + taskObj.put("task_id", IdUtil.getSnowflake(1,1).nextId()); + } + taskObj.put("task_code", CodeUtil.getNewCode("TASK_CODE")); + taskObj.put("task_type", "04"); + String task_status = TaskStatusEnum.START_AND_POINT.getCode(); + taskObj.put("task_status", task_status); + taskObj.put("start_point_code", form.getString("start_point_code")); + taskObj.put("next_point_code", form.getString("next_point_code")); + taskObj.put("vehicle_code", form.getString("vehicle_code")); + taskObj.put("create_id", SecurityUtils.getCurrentUserId()); + taskObj.put("create_time", DateUtil.now()); + taskObj.put("handle_class", THIS_CLASS); + //任务基础表【sch_base_task】 + WQLObject.getWQLObject("sch_base_task").insert(taskObj); + return taskObj.getString("task_id"); + + } + + + @Override + public void forceFinish(String task_id) { + if (StrUtil.isEmpty(task_id)) { + throw new BadRequestException("任务id不能为空!"); + } + JSONObject taskjo = WQLObject.getWQLObject("sch_base_task").query("task_id='" + task_id + "'").uniqueResult(0); + taskjo.getString("taskfinish_mode"); + this.updateTaskStatus(taskjo, TaskStatusEnum.FINISHED.getCode()); + } + + @Override + public void pullBack(String task_id) { + + } + + @Override + public void cancel(String task_id) { + + } +} diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/task/AcsTaskDto.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/task/AcsTaskDto.java index 1bafed8..4154d34 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/task/AcsTaskDto.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/task/AcsTaskDto.java @@ -5,7 +5,7 @@ import lombok.Data; @Data public class AcsTaskDto { //任务标识 - private String task_id; + private String ext_task_uuid; //任务编码 private String task_code; //任务类型 diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/task/AutoCreateTask.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/task/AutoCreateTask.java index 06d59b6..4ac8589 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/task/AutoCreateTask.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/task/AutoCreateTask.java @@ -90,7 +90,7 @@ public class AutoCreateTask { if ("200".equals(status)) { taskList.forEach(item -> { JSONObject taskObj = new JSONObject(); - taskObj.put("task_id", item.getTask_id()); + taskObj.put("task_id", item.getExt_task_uuid()); taskObj.put("task_status", TaskStatusEnum.ISSUE.getCode()); taskObj.put("remark", "下发成功"); taskObj.put("update_time", DateUtil.now()); @@ -99,7 +99,7 @@ public class AutoCreateTask { } else {//下发失败 taskList.forEach(item -> { JSONObject taskObj = new JSONObject(); - taskObj.put("task_id", item.getTask_id()); + taskObj.put("task_id", item.getExt_task_uuid()); taskObj.put("task_status", TaskStatusEnum.ISSUE.getCode()); taskObj.put("remark", "下发失败:" + message); taskObj.put("update_time", DateUtil.now()); diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/task/InTask.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/task/InTask.java index 0bd3a32..8f8dc75 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/task/InTask.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/task/InTask.java @@ -1,3 +1,4 @@ +/* package org.nl.wms.sch.task; import cn.hutool.core.date.DateUtil; @@ -20,18 +21,22 @@ import org.nl.wms.st.ivt.StoreIvtServiceImpl; import org.nl.wql.core.bean.WQLObject; import org.springframework.transaction.annotation.Transactional; +*/ /** * 入库任务生成 - */ + *//* + public class InTask extends AbstractAcsTask { private final String THIS_CLASS = InTask.class.getName(); @Transactional @Override public void updateTaskStatus(JSONObject taskObj, String status) { - /** + */ +/** *改变任务状态 - **/ + **//* + String task_id = taskObj.getString("task_id"); WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); JSONObject jsonTask = taskTab.query("task_id='" + task_id + "'").uniqueResult(0); @@ -152,12 +157,14 @@ public class InTask extends AbstractAcsTask { param.put("area_type", jsonTask.getString("buss_area_type")); param.put("height", disarr.getJSONObject(0).getString("height")); JSONObject structObj = new JSONObject(); - /* JSONArray structarr = StructFindUtil.getInStruct(param); + */ +/* JSONArray structarr = StructFindUtil.getInStruct(param); if (ObjectUtil.isEmpty(structarr)) { continue; } - structObj = structarr.getJSONObject(0);*/ + structObj = structarr.getJSONObject(0);*//* + String struct_code = structObj.getString("struct_code"); String bill_uuid = ""; @@ -259,3 +266,4 @@ public class InTask extends AbstractAcsTask { } } +*/ diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/st/basedata/service/wql/ST_StructRelaMaterial_01.wql b/wms/hd/nladmin-system/src/main/java/org/nl/wms/st/basedata/service/wql/ST_StructRelaMaterial_01.wql index 1978840..dd9d7c0 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/st/basedata/service/wql/ST_StructRelaMaterial_01.wql +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/st/basedata/service/wql/ST_StructRelaMaterial_01.wql @@ -43,28 +43,37 @@ IF 输入.flag = "1" PAGEQUERY - SELECT - view_struct.* - FROM - ( - SELECT - structrelamaterial.*, - struct.struct_code, - struct.struct_name, - sect.sect_name, - stor.stor_name - FROM - st_ivt_structrelamaterial structrelamaterial - LEFT JOIN st_ivt_structattr struct ON structrelamaterial.struct_id = struct.struct_id - LEFT JOIN st_ivt_sectattr sect ON struct.sect_id = sect.sect_id - LEFT JOIN st_ivt_bsrealstorattr stor ON struct.stor_id = stor.stor_id - WHERE - structrelamaterial.is_delete = '0' - GROUP BY - structrelamaterial.struct_id - ) view_struct - where - 1 = 1 + SELECT + view_struct.* + FROM + ( + SELECT + any_value ( structrelamaterial.relation_id ) AS relation_id, + any_value ( structrelamaterial.struct_id ) AS struct_id, + any_value ( structrelamaterial.material_id ) AS material_id, + any_value ( structrelamaterial.create_id ) AS create_id, + any_value ( structrelamaterial.create_name ) AS create_name, + any_value ( structrelamaterial.create_time ) AS create_time, + any_value ( structrelamaterial.update_optid ) AS update_optid, + any_value ( structrelamaterial.update_optname ) AS update_optname, + any_value ( structrelamaterial.update_time ) AS update_time, + any_value ( structrelamaterial.is_delete ) AS is_delete, + any_value ( struct.struct_code ) AS struct_code, + any_value ( struct.struct_name ) AS struct_name, + any_value ( sect.sect_name ) AS sect_name, + any_value ( stor.stor_name ) AS stor_name + FROM + st_ivt_structrelamaterial structrelamaterial + LEFT JOIN st_ivt_structattr struct ON structrelamaterial.struct_id = struct.struct_id + LEFT JOIN st_ivt_sectattr sect ON struct.sect_id = sect.sect_id + LEFT JOIN st_ivt_bsrealstorattr stor ON struct.stor_id = stor.stor_id + WHERE + structrelamaterial.is_delete = '0' + GROUP BY + structrelamaterial.struct_id + ) view_struct + WHERE + 1 = 1 OPTION 输入.search <> "" (view_struct.struct_code like 输入.search or view_struct.struct_name like 输入.search) diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/st/basedata/service/wql/ST_Structrelavehicletype_01.wql b/wms/hd/nladmin-system/src/main/java/org/nl/wms/st/basedata/service/wql/ST_Structrelavehicletype_01.wql index 2b090de..d7e7719 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/st/basedata/service/wql/ST_Structrelavehicletype_01.wql +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/st/basedata/service/wql/ST_Structrelavehicletype_01.wql @@ -54,26 +54,28 @@ IF 输入.flag = "2" PAGEQUERY - SELECT - * - FROM - ( - SELECT - vehicleType.struct_id, - vehicleType.create_id, - vehicleType.create_name, - vehicleType.create_time, - vehicleType.update_optname, - vehicleType.update_time, - GROUP_CONCAT(vehicleType.vehicle_type) as vehicle_type, - struct.struct_name, - struct.struct_code - FROM - ST_IVT_StructRelaVehicleType vehicleType - LEFT JOIN st_ivt_structattr struct ON vehicleType.struct_id = struct.struct_id - GROUP BY vehicleType.struct_id) AS view_vehicleType - WHERE - 1 = 1 + SELECT + * + FROM + ( + SELECT + any_value ( vehicleType.struct_id ) AS struct_id, + any_value ( vehicleType.create_id ) AS create_id, + any_value ( vehicleType.create_name ) AS create_name, + any_value ( vehicleType.create_time ) AS create_time, + any_value ( vehicleType.update_optname ) AS update_optname, + any_value ( struct.struct_code ) AS struct_code, + any_value ( vehicleType.update_time ) AS update_time, + any_value ( struct.struct_name ) AS struct_name, + any_value ( GROUP_CONCAT( vehicleType.vehicle_type ) ) AS vehicle_type + FROM + ST_IVT_StructRelaVehicleType vehicleType + LEFT JOIN st_ivt_structattr struct ON vehicleType.struct_id = struct.struct_id + GROUP BY + vehicleType.struct_id + ) AS view_vehicleType + WHERE + 1 = 1 OPTION 输入.search <> "" (view_vehicleType.struct_code like 输入.search or view_vehicleType.struct_name like 输入.search) diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/wms.xls b/wms/hd/nladmin-system/src/main/java/org/nl/wms/wms.xls index b66fca60514a829df409a5b2432237b7a370eb54..467a391b41aa383abd8bfb6340a41b258e8f6e65 100644 GIT binary patch delta 67158 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 E06rBqRR910 delta 39978 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 ZecqQ;XsNbzp|_J4UE%FiamWu0|9|fgVUhp<