Compare commits
3 Commits
7b962b0bfa
...
64174b4109
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
64174b4109 | ||
|
|
189ec73c73 | ||
|
|
78fccd3332 |
@@ -25,7 +25,7 @@ public class SecurityUtils {
|
|||||||
public static CurrentUser getCurrentUser() {
|
public static CurrentUser getCurrentUser() {
|
||||||
Object loginInfo = StpUtil.getExtra("loginInfo");
|
Object loginInfo = StpUtil.getExtra("loginInfo");
|
||||||
if (loginInfo==null){
|
if (loginInfo==null){
|
||||||
throw new BadRequestException("用户信息获取失败");
|
return CurrentUser.getDefaultUser();
|
||||||
}
|
}
|
||||||
return JSONObject.parseObject(String.valueOf(loginInfo),CurrentUser.class);
|
return JSONObject.parseObject(String.valueOf(loginInfo),CurrentUser.class);
|
||||||
|
|
||||||
@@ -46,13 +46,7 @@ public class SecurityUtils {
|
|||||||
* @return 系统用户名称
|
* @return 系统用户名称
|
||||||
*/
|
*/
|
||||||
public static String getCurrentNickName() {
|
public static String getCurrentNickName() {
|
||||||
// CurrentUser user = getCurrentUser();
|
return getCurrentUser().getPresonName();
|
||||||
// if (user!=null){
|
|
||||||
// return user.getPresonName();
|
|
||||||
// }
|
|
||||||
// return null;
|
|
||||||
//tofix postMan测试,完成后改回
|
|
||||||
return "admin";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -61,9 +55,7 @@ public class SecurityUtils {
|
|||||||
* @return 系统用户Id
|
* @return 系统用户Id
|
||||||
*/
|
*/
|
||||||
public static String getCurrentUserId() {
|
public static String getCurrentUserId() {
|
||||||
//return getCurrentUser().getId();
|
return getCurrentUser().getId();
|
||||||
//tofix postMan测试,完成后改回
|
|
||||||
return "1";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -72,7 +64,6 @@ public class SecurityUtils {
|
|||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public static Long getDeptId() {
|
public static Long getDeptId() {
|
||||||
// return getCurrentUser().getUser().getDept().getId();
|
|
||||||
return 1L;
|
return 1L;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ public class CurrentUser implements Serializable {
|
|||||||
CurrentUser def = new CurrentUser();
|
CurrentUser def = new CurrentUser();
|
||||||
def.setId("2");
|
def.setId("2");
|
||||||
def.setUsername("default");
|
def.setUsername("default");
|
||||||
def.setPresonName("外部系统用户");
|
def.setPresonName("默认用户");
|
||||||
return def;
|
return def;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
package org.nl.wms.ext_manage.controller;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.dev33.satoken.annotation.SaIgnore;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.nl.wms.ext_manage.service.dto.StructLineOfflineDTO;
|
||||||
|
import org.nl.wms.sch_manage.service.core.tasks.StructOfflineTask;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MES需求单同步接口
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("api/mes/structLine")
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class MesStructLineController {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private StructOfflineTask structOfflineTask;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 结构车间生产下料同步接口
|
||||||
|
* @param structLineOffline
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@PostMapping("/offline")
|
||||||
|
@SaIgnore
|
||||||
|
public ResponseEntity<Object> confirm(@RequestBody StructLineOfflineDTO structLineOffline) {
|
||||||
|
structOfflineTask.offline(structLineOffline);
|
||||||
|
return new ResponseEntity<>(HttpStatus.OK);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -47,7 +47,6 @@ public class MesApiServiceImpl implements MesApiService {
|
|||||||
throw new BadRequestException("请传MES失败,未配置MES_URL地址");
|
throw new BadRequestException("请传MES失败,未配置MES_URL地址");
|
||||||
}
|
}
|
||||||
String url = param.getValue();
|
String url = param.getValue();
|
||||||
// TODO: add demand order API path to EXTConstant once endpoint is confirmed
|
|
||||||
try {
|
try {
|
||||||
JSONObject requestParam = new JSONObject();
|
JSONObject requestParam = new JSONObject();
|
||||||
requestParam.put("OrderCode",workOrder);
|
requestParam.put("OrderCode",workOrder);
|
||||||
|
|||||||
@@ -0,0 +1,51 @@
|
|||||||
|
package org.nl.wms.ext_manage.service.dto;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class StructLineOfflineDTO {
|
||||||
|
/**
|
||||||
|
* 产线编码
|
||||||
|
*/
|
||||||
|
@JsonProperty("LineCode")
|
||||||
|
private String lineCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下料位置
|
||||||
|
*/
|
||||||
|
@JsonProperty("UnloadPort")
|
||||||
|
private String unloadPort;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 工单编码
|
||||||
|
*/
|
||||||
|
@JsonProperty("OrderCode")
|
||||||
|
private String orderCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下料数量
|
||||||
|
*/
|
||||||
|
@JsonProperty("UnloadQty")
|
||||||
|
private BigDecimal unloadQty;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 物料编码
|
||||||
|
*/
|
||||||
|
@JsonProperty("MaterialCode")
|
||||||
|
private String materialCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 物料名称
|
||||||
|
*/
|
||||||
|
@JsonProperty("MaterialName")
|
||||||
|
private String materialName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建时间
|
||||||
|
*/
|
||||||
|
@JsonProperty("CreatedOn")
|
||||||
|
private String createdOn;
|
||||||
|
}
|
||||||
@@ -28,7 +28,6 @@ public class WmsToZDWmdServiceImpl implements WmsToZDWmdService {
|
|||||||
public ResponseEntity syncDemandOrder(List<PmDemandDto> demands) {
|
public ResponseEntity syncDemandOrder(List<PmDemandDto> demands) {
|
||||||
log.info("syncDemandOrder生产领料需求单下发输入参数:-------------------" + demands.size());
|
log.info("syncDemandOrder生产领料需求单下发输入参数:-------------------" + demands.size());
|
||||||
String url = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode(SysParamConstant.ZD_URL).getValue();
|
String url = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode(SysParamConstant.ZD_URL).getValue();
|
||||||
// TODO: add demand order API path to EXTConstant once endpoint is confirmed
|
|
||||||
try {
|
try {
|
||||||
String resultMsg = HttpRequest.post(url)
|
String resultMsg = HttpRequest.post(url)
|
||||||
.body(JSONArray.parseArray(JSON.toJSONString(demands)).toJSONString())
|
.body(JSONArray.parseArray(JSON.toJSONString(demands)).toJSONString())
|
||||||
@@ -45,7 +44,6 @@ public class WmsToZDWmdServiceImpl implements WmsToZDWmdService {
|
|||||||
public ResponseEntity syncPurchaseReceiving(JSONObject whereJson) {
|
public ResponseEntity syncPurchaseReceiving(JSONObject whereJson) {
|
||||||
log.info("syncPurchaseReceiving采购入库单下发输入参数:-------------------" + whereJson.toString());
|
log.info("syncPurchaseReceiving采购入库单下发输入参数:-------------------" + whereJson.toString());
|
||||||
String url = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode(SysParamConstant.ZD_URL).getValue();
|
String url = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode(SysParamConstant.ZD_URL).getValue();
|
||||||
// TODO: add purchase receiving API path to EXTConstant once endpoint is confirmed
|
|
||||||
try {
|
try {
|
||||||
String resultMsg = HttpRequest.post(url)
|
String resultMsg = HttpRequest.post(url)
|
||||||
.body(whereJson.toString())
|
.body(whereJson.toString())
|
||||||
|
|||||||
@@ -305,7 +305,6 @@ public class PdaIosOutServiceImpl implements PdaIosOutService {
|
|||||||
.eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库"))
|
.eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库"))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
//TODO:生成手工领料单
|
|
||||||
final PmStockReturn stockReturn = new PmStockReturn();
|
final PmStockReturn stockReturn = new PmStockReturn();
|
||||||
stockReturn.setCreate_time(DateUtil.now());
|
stockReturn.setCreate_time(DateUtil.now());
|
||||||
stockReturn.setRequest_type(IOSEnum.BILL_TYPE.code("生产出库"));
|
stockReturn.setRequest_type(IOSEnum.BILL_TYPE.code("生产出库"));
|
||||||
|
|||||||
@@ -83,6 +83,7 @@ public interface ISchBasePointService extends IService<SchBasePoint> {
|
|||||||
* @return SchBasePoint
|
* @return SchBasePoint
|
||||||
*/
|
*/
|
||||||
SchBasePoint selectByIdLock(String id);
|
SchBasePoint selectByIdLock(String id);
|
||||||
|
SchBasePoint selectByCode(String code);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 释放点位
|
* 释放点位
|
||||||
|
|||||||
@@ -171,11 +171,5 @@ public abstract class AbstractTask {
|
|||||||
*/
|
*/
|
||||||
public abstract void cancel(String task_code);
|
public abstract void cancel(String task_code);
|
||||||
|
|
||||||
/**
|
|
||||||
* 回传mes
|
|
||||||
* @param task_code 任务号
|
|
||||||
*/
|
|
||||||
public abstract void backMes(String task_code);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -130,9 +130,7 @@ public class BackInTask extends AbstractTask {
|
|||||||
this.cancelTask(taskObj);
|
this.cancelTask(taskObj);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void backMes(String task_code) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
public void finishTask(SchBaseTask taskObj) {
|
public void finishTask(SchBaseTask taskObj) {
|
||||||
|
|||||||
@@ -129,9 +129,7 @@ public class MoveTask extends AbstractTask {
|
|||||||
this.cancelTask(taskObj);
|
this.cancelTask(taskObj);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void backMes(String task_code) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
public void finishTask(SchBaseTask taskObj) {
|
public void finishTask(SchBaseTask taskObj) {
|
||||||
|
|||||||
@@ -130,9 +130,7 @@ public class PdaPointTask extends AbstractTask {
|
|||||||
this.cancelTask(taskObj);
|
this.cancelTask(taskObj);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void backMes(String task_code) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
public void finishTask(SchBaseTask taskObj) {
|
public void finishTask(SchBaseTask taskObj) {
|
||||||
|
|||||||
@@ -130,9 +130,6 @@ public class StInTask extends AbstractTask {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void backMes(String task_code) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void finishTask(SchBaseTask taskObj) {
|
public void finishTask(SchBaseTask taskObj) {
|
||||||
|
|||||||
@@ -125,9 +125,7 @@ public class StOutTask extends AbstractTask {
|
|||||||
this.cancelTask(taskObj);
|
this.cancelTask(taskObj);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void backMes(String task_code) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void finishTask(SchBaseTask taskObj) {
|
public void finishTask(SchBaseTask taskObj) {
|
||||||
|
|||||||
@@ -0,0 +1,174 @@
|
|||||||
|
package org.nl.wms.sch_manage.service.core.tasks;
|
||||||
|
|
||||||
|
import cn.hutool.core.date.DateUtil;
|
||||||
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.nl.common.exception.BadRequestException;
|
||||||
|
import org.nl.common.utils.CodeUtil;
|
||||||
|
import org.nl.common.utils.IdUtil;
|
||||||
|
import org.nl.common.utils.SecurityUtils;
|
||||||
|
import org.nl.config.SpringContextHolder;
|
||||||
|
import org.nl.wms.basedata_manage.service.IMdMeMaterialbaseService;
|
||||||
|
import org.nl.wms.basedata_manage.service.IStructattrService;
|
||||||
|
import org.nl.wms.basedata_manage.service.dao.BsrealStorattr;
|
||||||
|
import org.nl.wms.basedata_manage.service.dao.MdMeMaterialbase;
|
||||||
|
import org.nl.wms.basedata_manage.service.dao.Sectattr;
|
||||||
|
import org.nl.wms.basedata_manage.service.dao.Structattr;
|
||||||
|
import org.nl.wms.basedata_manage.service.dto.StrategyStructParam;
|
||||||
|
import org.nl.wms.ext_manage.service.dto.StructLineOfflineDTO;
|
||||||
|
import org.nl.wms.pm_manage.purchase.ListenerHandler.PurchaseListenerParams;
|
||||||
|
import org.nl.wms.sch_manage.enums.StatusEnum;
|
||||||
|
import org.nl.wms.sch_manage.enums.TaskStatus;
|
||||||
|
import org.nl.wms.sch_manage.service.ISchBasePointService;
|
||||||
|
import org.nl.wms.sch_manage.service.core.AbstractTask;
|
||||||
|
import org.nl.wms.sch_manage.service.core.AcsTaskDto;
|
||||||
|
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
|
||||||
|
import org.nl.wms.warehouse_manage.enums.IOSEnum;
|
||||||
|
import org.nl.wms.warehouse_manage.inAndOut.service.IInBillService;
|
||||||
|
import org.nl.wms.warehouse_manage.inAndOut.service.dao.IOStorInvDtl;
|
||||||
|
import org.nl.wms.warehouse_manage.inAndOut.service.dto.IOStorInvDisDto;
|
||||||
|
import org.nl.wms.warehouse_manage.inventory.IStInventoryService;
|
||||||
|
import org.nl.wms.warehouse_manage.service.IMdPbGroupplateService;
|
||||||
|
import org.nl.wms.warehouse_manage.service.dao.GroupPlate;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
import static org.nl.wms.warehouse_manage.enums.IOSEnum.GROUP_PLATE_STATUS;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 焊接区域半成品入库
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class StructOfflineTask extends AbstractTask {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IInBillService iInBillService;
|
||||||
|
@Autowired
|
||||||
|
private IMdPbGroupplateService iMdPbGroupplateService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ISchBasePointService iSchBasePointService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMdMeMaterialbaseService iMdMeMaterialbaseService;
|
||||||
|
@Autowired
|
||||||
|
private IStructattrService iStructattrService;
|
||||||
|
/**
|
||||||
|
* 生成生产入库任务,任务完成
|
||||||
|
*/
|
||||||
|
public void offline(StructLineOfflineDTO offlineDTO){
|
||||||
|
SchBasePoint schBasePoint = iSchBasePointService.selectByCode(offlineDTO.getUnloadPort());
|
||||||
|
String storagevehicleCode = schBasePoint.getStoragevehicle_code();
|
||||||
|
if (StringUtils.isEmpty(storagevehicleCode)){
|
||||||
|
throw new BadRequestException("下线失败,下料点没有绑定托盘号");
|
||||||
|
}
|
||||||
|
final MdMeMaterialbase materialbase = iMdMeMaterialbaseService.getByCode(offlineDTO.getMaterialCode());
|
||||||
|
if (materialbase == null){
|
||||||
|
throw new BadRequestException("下线失败,物料编码未同步");
|
||||||
|
}
|
||||||
|
final GroupPlate plate = new GroupPlate();
|
||||||
|
plate.setStoragevehicle_code(storagevehicleCode);
|
||||||
|
plate.setGroup_id(IdUtil.getStringId());
|
||||||
|
plate.setCreate_id(SecurityUtils.getCurrentUserId());
|
||||||
|
plate.setCreate_name("MES");
|
||||||
|
plate.setCreate_time(DateUtil.now());
|
||||||
|
plate.setMaterial_code(materialbase.getMaterial_code());
|
||||||
|
plate.setQty(offlineDTO.getUnloadQty());
|
||||||
|
plate.setQty_unit_id(materialbase.getQty_unit_id());
|
||||||
|
plate.setQty_unit_name(materialbase.getQty_unit_id());
|
||||||
|
plate.setStatus(IOSEnum.GROUP_PLATE_STATUS.code("组盘"));
|
||||||
|
iMdPbGroupplateService.save(plate);
|
||||||
|
//强制:下线点对应的区域就是半成品库区编码
|
||||||
|
final String regionCode = schBasePoint.getRegion_code();
|
||||||
|
List<Structattr> structattrs = iStructattrService.inBoundSectDiv(StrategyStructParam.builder()
|
||||||
|
.ioType(StatusEnum.STRATEGY_TYPE.code("入库"))
|
||||||
|
.sect_code(regionCode)
|
||||||
|
.storagevehicle_code(plate.getStoragevehicle_code())
|
||||||
|
.strategyMaters(new ArrayList<>())
|
||||||
|
.build());
|
||||||
|
final Structattr structattr = structattrs.get(0);
|
||||||
|
// 组织主表数据
|
||||||
|
Map<String, Object> jsonMst = new HashMap<>();
|
||||||
|
jsonMst.put("stor_id", structattr.getStor_id());
|
||||||
|
jsonMst.put("bill_status", IOSEnum.BILL_STATUS.code("分配完"));
|
||||||
|
jsonMst.put("total_qty", plate.getQty());
|
||||||
|
jsonMst.put("detail_count", 1);
|
||||||
|
jsonMst.put("bill_type", IOSEnum.BILL_TYPE.code("生产入库"));
|
||||||
|
jsonMst.put("biz_date", DateUtil.now());
|
||||||
|
// 组织明细数据
|
||||||
|
ArrayList<HashMap> tableData = new ArrayList<>();
|
||||||
|
HashMap<String, Object> dtl = new HashMap<>();
|
||||||
|
dtl.put("storagevehicle_code", plate.getStoragevehicle_code());
|
||||||
|
dtl.put("material_id", materialbase.getMaterial_id());
|
||||||
|
dtl.put("material_code", materialbase.getMaterial_code());
|
||||||
|
dtl.put("material_name", materialbase.getMaterial_name());
|
||||||
|
dtl.put("pcsn", plate.getPcsn());
|
||||||
|
dtl.put("qty_unit_id", materialbase.getQty_unit_id());
|
||||||
|
dtl.put("qty_unit_name", materialbase.getQty_unit_name());
|
||||||
|
dtl.put("qty", plate.getQty());
|
||||||
|
dtl.put("plan_qty", plate.getQty());
|
||||||
|
// 调用新增
|
||||||
|
tableData.add(dtl);
|
||||||
|
jsonMst.put("tableData",tableData);
|
||||||
|
String iostorinv_id = iInBillService.insertDtl(jsonMst);
|
||||||
|
// 组织主数据
|
||||||
|
JSONObject divStructParam= new JSONObject();
|
||||||
|
divStructParam.put("checked", false);
|
||||||
|
divStructParam.put("stor_code", structattr.getStor_code());
|
||||||
|
divStructParam.put("sect_code", structattr.getSect_code());
|
||||||
|
final JSONObject disRow = new JSONObject();
|
||||||
|
divStructParam.put("dis_row", disRow);
|
||||||
|
disRow.put("struct_code",structattr.getStruct_code());
|
||||||
|
disRow.put("storagevehicle_code", plate.getStoragevehicle_code());
|
||||||
|
disRow.put("iostorinv_id", iostorinv_id);
|
||||||
|
// 调用分配,默认自动分配库位
|
||||||
|
iInBillService.divStruct(divStructParam);
|
||||||
|
// 下发任务
|
||||||
|
// 组织 divPoint 参数
|
||||||
|
Map<String, Object> divPointParam = new HashMap<>();
|
||||||
|
divPointParam.put("point_code", offlineDTO.getUnloadPort());
|
||||||
|
ArrayList<HashMap<String, String>> tableMater = new ArrayList<>();
|
||||||
|
HashMap<String, String> materRow = new HashMap<>();
|
||||||
|
materRow.put("iostorinv_id", iostorinv_id); // 入库单明细ID
|
||||||
|
materRow.put("iostorinvdis_id", iostorinvdis_id); // 分配明细ID(如果有)
|
||||||
|
materRow.put("storagevehicle_code", storagevehicleCode); // 载具编码
|
||||||
|
tableMater.add(materRow);
|
||||||
|
divPointParam.put("tableMater", tableMater);
|
||||||
|
iInBillService.divPoint(divPointParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String create(JSONObject json) {
|
||||||
|
|
||||||
|
|
||||||
|
String task_id = stInTask.create(task_form);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AcsTaskDto sendAcsParam(String taskId) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void updateStatus(String task_code, TaskStatus status) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void forceFinish(String task_code) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void cancel(String task_code) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -130,9 +130,7 @@ public class VehicleInTask extends AbstractTask {
|
|||||||
this.cancelTask(taskObj);
|
this.cancelTask(taskObj);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void backMes(String task_code) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
public void finishTask(SchBaseTask taskObj) {
|
public void finishTask(SchBaseTask taskObj) {
|
||||||
|
|||||||
@@ -125,9 +125,7 @@ public class VehicleOutTask extends AbstractTask {
|
|||||||
this.cancelTask(taskObj);
|
this.cancelTask(taskObj);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void backMes(String task_code) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void finishTask(SchBaseTask taskObj) {
|
public void finishTask(SchBaseTask taskObj) {
|
||||||
|
|||||||
@@ -195,6 +195,14 @@ public class SchBasePointServiceImpl extends ServiceImpl<SchBasePointMapper, Sch
|
|||||||
return pointMapper.selectByIdLock(id);
|
return pointMapper.selectByIdLock(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SchBasePoint selectByCode(String code) {
|
||||||
|
if (StringUtils.isEmpty(code)){
|
||||||
|
throw new BadRequestException("查询点位失败,编码为空");
|
||||||
|
}
|
||||||
|
return this.getOne(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getPoint_code,code));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void unLockPoint(String point_code) {
|
public void unLockPoint(String point_code) {
|
||||||
this.update(
|
this.update(
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
|
|||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import org.apache.commons.collections4.CollectionUtils;
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.nl.common.domain.query.PageQuery;
|
import org.nl.common.domain.query.PageQuery;
|
||||||
import org.nl.common.exception.BadRequestException;
|
import org.nl.common.exception.BadRequestException;
|
||||||
import org.nl.common.utils.CodeUtil;
|
import org.nl.common.utils.CodeUtil;
|
||||||
@@ -28,6 +29,7 @@ import org.nl.wms.basedata_manage.service.dao.mapper.MdPbStoragevehicleinfoMappe
|
|||||||
import org.nl.wms.basedata_manage.service.dto.StrategyMater;
|
import org.nl.wms.basedata_manage.service.dto.StrategyMater;
|
||||||
import org.nl.wms.basedata_manage.service.dto.StrategyStructParam;
|
import org.nl.wms.basedata_manage.service.dto.StrategyStructParam;
|
||||||
import org.nl.wms.basedata_manage.service.dto.StructattrChangeDto;
|
import org.nl.wms.basedata_manage.service.dto.StructattrChangeDto;
|
||||||
|
import org.nl.wms.sch_manage.enums.StatusEnum;
|
||||||
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
|
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
|
||||||
import org.nl.wms.sch_manage.service.core.tasks.StInTask;
|
import org.nl.wms.sch_manage.service.core.tasks.StInTask;
|
||||||
import org.nl.wms.warehouse_manage.enums.IOSConstant;
|
import org.nl.wms.warehouse_manage.enums.IOSConstant;
|
||||||
@@ -369,6 +371,7 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
|
|||||||
String struct_name = "";
|
String struct_name = "";
|
||||||
//是否自动分配仓位
|
//是否自动分配仓位
|
||||||
Boolean checked = mst.getBoolean("checked");
|
Boolean checked = mst.getBoolean("checked");
|
||||||
|
Structattr struct;
|
||||||
if (ObjectUtil.isNotEmpty(checked) && checked) {
|
if (ObjectUtil.isNotEmpty(checked) && checked) {
|
||||||
//根据载具进行分配货位
|
//根据载具进行分配货位
|
||||||
List<StrategyMater> maters = new ArrayList<>();
|
List<StrategyMater> maters = new ArrayList<>();
|
||||||
@@ -382,31 +385,25 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
|
|||||||
}
|
}
|
||||||
List<Structattr> structattrs = iStructattrService.inBoundSectDiv(
|
List<Structattr> structattrs = iStructattrService.inBoundSectDiv(
|
||||||
StrategyStructParam.builder()
|
StrategyStructParam.builder()
|
||||||
.ioType(param.getString("ioType"))
|
.ioType(StatusEnum.STRATEGY_TYPE.code("入库"))
|
||||||
.sect_code(param.getString("sect_code"))
|
.sect_code(param.getString("sect_code"))
|
||||||
.stor_code(param.getString("stor_code"))
|
.stor_code(param.getString("stor_code"))
|
||||||
.storagevehicle_code(param.getString("storagevehicle_code"))
|
.storagevehicle_code(param.getString("storagevehicle_code"))
|
||||||
.strategyMaters(maters)
|
.strategyMaters(maters)
|
||||||
.build());
|
.build());
|
||||||
Structattr struct = structattrs.get(0);
|
struct = structattrs.get(0);
|
||||||
sect_id = struct.getSect_id();
|
|
||||||
sect_code = struct.getSect_code();
|
|
||||||
sect_name = struct.getSect_name();
|
|
||||||
struct_id = struct.getStruct_id();
|
|
||||||
struct_code = struct.getStruct_code();
|
|
||||||
struct_name = struct.getStruct_name();
|
|
||||||
} else {
|
} else {
|
||||||
Structattr structattr = iStructattrService.findById(map.getString("struct_id"));
|
if (StringUtils.isEmpty(map.getString("struct_code"))){
|
||||||
MdPbStoragevehicleinfo mdPbStoragevehicleinfo = mdPbStoragevehicleinfoMapper.selectOne(new LambdaQueryWrapper<>(MdPbStoragevehicleinfo.class)
|
throw new BadRequestException("分配失败,手动分配struct_code为空");
|
||||||
.eq(MdPbStoragevehicleinfo::getStoragevehicle_code, map.get("storagevehicle_code"))
|
}
|
||||||
);
|
struct = iStructattrService.findByCode(map.getString("struct_code"));
|
||||||
sect_id = map.getString("sect_id");
|
|
||||||
sect_code = map.getString("sect_code");
|
|
||||||
sect_name = map.getString("sect_name");
|
|
||||||
struct_id = map.getString("struct_id");
|
|
||||||
struct_code = map.getString("struct_code");
|
|
||||||
struct_name = map.getString("struct_name");
|
|
||||||
}
|
}
|
||||||
|
sect_id = struct.getSect_id();
|
||||||
|
sect_code = struct.getSect_code();
|
||||||
|
sect_name = struct.getSect_name();
|
||||||
|
struct_id = struct.getStruct_id();
|
||||||
|
struct_code = struct.getStruct_code();
|
||||||
|
struct_name = struct.getStruct_name();
|
||||||
JSONObject dis_map = new JSONObject();
|
JSONObject dis_map = new JSONObject();
|
||||||
dis_map.put("sect_id", sect_id);
|
dis_map.put("sect_id", sect_id);
|
||||||
dis_map.put("sect_code", sect_code);
|
dis_map.put("sect_code", sect_code);
|
||||||
|
|||||||
@@ -1133,7 +1133,6 @@ public class OutBillServiceImpl extends ServiceImpl<IOStorInvMapper,IOStorInv> i
|
|||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
@Transactional
|
@Transactional
|
||||||
//TODO:调拨还是直接出库
|
|
||||||
public void disFinish(List<IOStorInvDis> disList) {
|
public void disFinish(List<IOStorInvDis> disList) {
|
||||||
// 完成当前任务对应的所有分配明细
|
// 完成当前任务对应的所有分配明细
|
||||||
List<OutFinishParam> outFinsParams = new ArrayList<>();
|
List<OutFinishParam> outFinsParams = new ArrayList<>();
|
||||||
@@ -1191,7 +1190,7 @@ public class OutBillServiceImpl extends ServiceImpl<IOStorInvMapper,IOStorInv> i
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
iStInventoryService.changeInventory(InventoryChangeType.ADD_INV, addInvParams);
|
iStInventoryService.changeInventory(InventoryChangeType.ADD_INV, addInvParams);
|
||||||
//生成调拨入库单据
|
//TODO:生成调拨入库单据
|
||||||
}
|
}
|
||||||
// 如果分配明细全部完成则更新明细表状态
|
// 如果分配明细全部完成则更新明细表状态
|
||||||
if (countDis == 0){
|
if (countDis == 0){
|
||||||
|
|||||||
@@ -68,7 +68,6 @@ public class StInventoryServiceImpl implements IStInventoryService {
|
|||||||
.material_code(invParam.getMaterialCode())
|
.material_code(invParam.getMaterialCode())
|
||||||
.storagevehicle_code(invParam.getStoragevehicleCode())
|
.storagevehicle_code(invParam.getStoragevehicleCode())
|
||||||
.pcsn(invParam.getPcsn())
|
.pcsn(invParam.getPcsn())
|
||||||
//TODO:先给默认个
|
|
||||||
.qty_unit_id(invParam.getUnitId())
|
.qty_unit_id(invParam.getUnitId())
|
||||||
.qty_unit_name(invParam.getUnitName())
|
.qty_unit_name(invParam.getUnitName())
|
||||||
.qty(invParam.getQty())
|
.qty(invParam.getQty())
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ public class InteractionController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/blank")
|
@PostMapping("/blank")
|
||||||
@Log("产线下料半成品入库请求")
|
@Log("产线下线半成品入库请求")
|
||||||
public ResponseEntity<Object> blank()
|
public ResponseEntity<Object> blank()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import org.nl.common.domain.query.PageQuery;
|
|||||||
import org.nl.common.logging.annotation.Log;
|
import org.nl.common.logging.annotation.Log;
|
||||||
import org.nl.wms.welding_manage.service.work_order.IWorkOrderService;
|
import org.nl.wms.welding_manage.service.work_order.IWorkOrderService;
|
||||||
import org.nl.wms.welding_manage.service.work_order.dto.WorkOrderDto;
|
import org.nl.wms.welding_manage.service.work_order.dto.WorkOrderDto;
|
||||||
|
import org.nl.wms.welding_manage.service.work_order.dto.WorkOrderQuery;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
@@ -29,9 +30,13 @@ public class WorkOrderController {
|
|||||||
|
|
||||||
@GetMapping
|
@GetMapping
|
||||||
@Log("分页查询工单列表和详情")
|
@Log("分页查询工单列表和详情")
|
||||||
public ResponseEntity<Object> query(@RequestParam Map params, PageQuery page)
|
public ResponseEntity<Object> query(WorkOrderQuery query, PageQuery page) {
|
||||||
{
|
return new ResponseEntity<>(TableDataInfo.build(iWorkOrderService.page(page.build(),query.build())), HttpStatus.OK);
|
||||||
return new ResponseEntity<>(TableDataInfo.build(iWorkOrderService.queryList(page, params)), HttpStatus.OK);
|
}
|
||||||
|
@GetMapping("/getOrderItem")
|
||||||
|
@SaIgnore
|
||||||
|
public ResponseEntity<Object> getOrderItem(String orderCode) {
|
||||||
|
return new ResponseEntity<>(TableDataInfo.build(iWorkOrderService.getOrderBomItem(orderCode)), HttpStatus.OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping
|
@PostMapping
|
||||||
|
|||||||
@@ -3,10 +3,12 @@ package org.nl.wms.welding_manage.service.work_order;
|
|||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
import org.nl.common.domain.query.PageQuery;
|
import org.nl.common.domain.query.PageQuery;
|
||||||
|
import org.nl.wms.welding_manage.service.work_order.dao.WorkOrderBomDao;
|
||||||
import org.nl.wms.welding_manage.service.work_order.dao.WorkOrderDao;
|
import org.nl.wms.welding_manage.service.work_order.dao.WorkOrderDao;
|
||||||
import org.nl.wms.welding_manage.service.work_order.dto.WorkOrderDto;
|
import org.nl.wms.welding_manage.service.work_order.dto.WorkOrderDto;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public interface IWorkOrderService extends IService<WorkOrderDao> {
|
public interface IWorkOrderService extends IService<WorkOrderDao> {
|
||||||
@@ -34,4 +36,6 @@ public interface IWorkOrderService extends IService<WorkOrderDao> {
|
|||||||
* 修改工单已使用bom数量
|
* 修改工单已使用bom数量
|
||||||
*/
|
*/
|
||||||
void updateBomUseQty(String id, BigDecimal qty);
|
void updateBomUseQty(String id, BigDecimal qty);
|
||||||
|
|
||||||
|
List<WorkOrderBomDao> getOrderBomItem(String orderCode);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
|||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import io.lettuce.core.dynamic.annotation.Param;
|
import io.lettuce.core.dynamic.annotation.Param;
|
||||||
|
import org.apache.ibatis.annotations.Select;
|
||||||
|
import org.nl.wms.welding_manage.service.work_order.dao.WorkOrderBomDao;
|
||||||
import org.nl.wms.welding_manage.service.work_order.dao.WorkOrderDao;
|
import org.nl.wms.welding_manage.service.work_order.dao.WorkOrderDao;
|
||||||
import org.nl.wms.welding_manage.service.work_order.dto.WorkOrderDto;
|
import org.nl.wms.welding_manage.service.work_order.dto.WorkOrderDto;
|
||||||
|
|
||||||
@@ -13,6 +15,9 @@ import java.util.Map;
|
|||||||
|
|
||||||
public interface WorkOrderMapper extends BaseMapper<WorkOrderDao> {
|
public interface WorkOrderMapper extends BaseMapper<WorkOrderDao> {
|
||||||
|
|
||||||
|
@Select("SELECT * FROM md_work_order_bom WHERE work_order_code = #{orderCode} ORDER BY item_no ASC")
|
||||||
|
List<WorkOrderBomDao> getOrderBomItem(String orderCode);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分页查询工单
|
* 分页查询工单
|
||||||
* @param page
|
* @param page
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package org.nl.wms.welding_manage.service.work_order.dto;
|
||||||
|
|
||||||
|
import org.nl.common.domain.query.BaseQuery;
|
||||||
|
import org.nl.wms.welding_manage.service.work_order.dao.WorkOrderDao;
|
||||||
|
|
||||||
|
public class WorkOrderQuery extends BaseQuery<WorkOrderDao> {
|
||||||
|
}
|
||||||
@@ -4,7 +4,10 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
|
|||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.nl.common.domain.query.PageQuery;
|
import org.nl.common.domain.query.PageQuery;
|
||||||
|
import org.nl.common.exception.BadRequestException;
|
||||||
|
import org.nl.wms.welding_manage.service.work_order.dao.WorkOrderBomDao;
|
||||||
import org.nl.wms.welding_manage.service.work_order.dao.WorkOrderDao;
|
import org.nl.wms.welding_manage.service.work_order.dao.WorkOrderDao;
|
||||||
import org.nl.wms.welding_manage.service.work_order.dao.mapper.WorkOrderMapper;
|
import org.nl.wms.welding_manage.service.work_order.dao.mapper.WorkOrderMapper;
|
||||||
import org.nl.wms.welding_manage.service.work_order.dto.WorkOrderDto;
|
import org.nl.wms.welding_manage.service.work_order.dto.WorkOrderDto;
|
||||||
@@ -12,7 +15,6 @@ import org.nl.wms.welding_manage.service.work_order.IWorkOrderService;
|
|||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.util.StringUtils;
|
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
@@ -56,8 +58,7 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
|
|||||||
}
|
}
|
||||||
|
|
||||||
String snListString = record.getWorkOrderSnListString();
|
String snListString = record.getWorkOrderSnListString();
|
||||||
if (StringUtils.hasText(snListString)) {
|
if (!StringUtils.isEmpty(snListString)){
|
||||||
// 按逗号分割字符串,并去除空白字符,转换为List
|
|
||||||
List<String> snList = Arrays.stream(snListString.split(","))
|
List<String> snList = Arrays.stream(snListString.split(","))
|
||||||
.map(String::trim)
|
.map(String::trim)
|
||||||
.filter(s -> !s.isEmpty())
|
.filter(s -> !s.isEmpty())
|
||||||
@@ -109,4 +110,12 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
|
|||||||
public void updateBomUseQty(String id, BigDecimal qty) {
|
public void updateBomUseQty(String id, BigDecimal qty) {
|
||||||
workOrderMapper.updateBomUseQty(id, qty);
|
workOrderMapper.updateBomUseQty(id, qty);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<WorkOrderBomDao> getOrderBomItem(String orderCode) {
|
||||||
|
if (StringUtils.isEmpty(orderCode)){
|
||||||
|
throw new BadRequestException("查询工单明细失败,工单编号为空");
|
||||||
|
}
|
||||||
|
return workOrderMapper.getOrderBomItem(orderCode);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
305
nladmin-ui/src/views/wms/pm_manage/work_order/index.vue
Normal file
305
nladmin-ui/src/views/wms/pm_manage/work_order/index.vue
Normal file
@@ -0,0 +1,305 @@
|
|||||||
|
<template>
|
||||||
|
<div class="app-container">
|
||||||
|
<div class="head-container">
|
||||||
|
<!-- 查询区域 -->
|
||||||
|
<div>
|
||||||
|
<el-form :inline="true" label-position="right" label-width="100px" label-suffix=":" class="demo-form-inline">
|
||||||
|
<el-form-item label="工单编号">
|
||||||
|
<el-input v-model="query.order_code" clearable size="mini" placeholder="请输入工单编号" @keyup.enter.native="crud.toQuery" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="产品名称">
|
||||||
|
<el-input v-model="query.product_name" clearable size="mini" placeholder="请输入产品名称" @keyup.enter.native="crud.toQuery" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="BOM编码">
|
||||||
|
<el-input v-model="query.bom_code" clearable size="mini" placeholder="请输入BOM编码" @keyup.enter.native="crud.toQuery" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="工作区域">
|
||||||
|
<el-input v-model="query.work_area" clearable size="mini" placeholder="请输入工作区域" @keyup.enter.native="crud.toQuery" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="状态">
|
||||||
|
<el-select v-model="query.status" clearable size="mini" placeholder="请选择状态" class="filter-item" @change="crud.toQuery">
|
||||||
|
<el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<rrOperation :crud="crud" />
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 操作按钮区域 -->
|
||||||
|
<div style="margin-bottom: 10px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap;">
|
||||||
|
<crudOperation :permission="permission" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 新增/编辑对话框 -->
|
||||||
|
<el-dialog
|
||||||
|
:close-on-click-modal="false"
|
||||||
|
:before-close="crud.cancelCU"
|
||||||
|
:visible.sync="crud.status.cu > 0"
|
||||||
|
:title="crud.status.title"
|
||||||
|
width="960px"
|
||||||
|
>
|
||||||
|
<el-form ref="form" :model="form" :rules="rules" size="mini" label-width="120px" label-suffix=":" style="border: 1px solid #cfe0df; margin-top: 10px; padding: 10px;">
|
||||||
|
<el-row>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="工单编号" prop="order_code">
|
||||||
|
<el-input v-model.trim="form.order_code" style="width: 280px;" placeholder="请输入工单编号" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="产品编码" prop="product_code">
|
||||||
|
<el-input v-model.trim="form.product_code" style="width: 280px;" placeholder="请输入产品编码" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="产品名称" prop="product_name">
|
||||||
|
<el-input v-model.trim="form.product_name" style="width: 280px;" placeholder="请输入产品名称" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="产品规格" prop="product_spec">
|
||||||
|
<el-input v-model.trim="form.product_spec" style="width: 280px;" placeholder="请输入产品规格" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="计划数量" prop="order_qty">
|
||||||
|
<el-input-number v-model="form.order_qty" :min="0" :step="1" style="width: 280px;" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="单位" prop="unit">
|
||||||
|
<el-input v-model.trim="form.unit" style="width: 280px;" placeholder="请输入单位" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="BOM编码" prop="bom_code">
|
||||||
|
<el-input v-model.trim="form.bom_code" style="width: 280px;" placeholder="请输入BOM编码" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="工作区域" prop="work_area">
|
||||||
|
<el-input v-model.trim="form.work_area" style="width: 280px;" placeholder="请输入工作区域" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="计划开始时间" prop="plan_started_on">
|
||||||
|
<el-date-picker v-model="form.plan_started_on" type="datetime" value-format="yyyy-MM-dd HH:mm:ss" placeholder="请选择计划开始时间" style="width: 280px;" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="计划完成时间" prop="plan_finished_on">
|
||||||
|
<el-date-picker v-model="form.plan_finished_on" type="datetime" value-format="yyyy-MM-dd HH:mm:ss" placeholder="请选择计划完成时间" style="width: 280px;" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="状态" prop="status">
|
||||||
|
<el-select v-model="form.status" style="width: 280px;" placeholder="请选择状态">
|
||||||
|
<el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="备注" prop="remark">
|
||||||
|
<el-input v-model.trim="form.remark" style="width: 280px;" placeholder="请输入备注" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</el-form>
|
||||||
|
<div slot="footer" class="dialog-footer">
|
||||||
|
<el-button type="text" @click="crud.cancelCU">取消</el-button>
|
||||||
|
<el-button :loading="crud.cu === 2" type="primary" @click="crud.submitCU">确认</el-button>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
|
||||||
|
<!-- 工单明细对话框 -->
|
||||||
|
<el-dialog
|
||||||
|
:visible.sync="detailVisible"
|
||||||
|
title="工单明细(BOM清单)"
|
||||||
|
width="1100px"
|
||||||
|
:close-on-click-modal="false"
|
||||||
|
@close="closeDetailDialog"
|
||||||
|
>
|
||||||
|
<div style="margin-bottom: 10px; color: #606266; font-size: 13px;">
|
||||||
|
工单编号:<strong>{{ currentWorkOrder.order_code }}</strong> |
|
||||||
|
产品:<strong>{{ currentWorkOrder.product_code }} {{ currentWorkOrder.product_name }}</strong> |
|
||||||
|
计划数量:<strong style="color: #E6A23C;">{{ currentWorkOrder.order_qty }} {{ currentWorkOrder.unit }}</strong>
|
||||||
|
</div>
|
||||||
|
<el-table v-loading="detailLoading" :data="bomList" size="small" border max-height="480">
|
||||||
|
<el-table-column type="index" label="序号" width="55" align="center" />
|
||||||
|
<el-table-column prop="item_no" label="行号" width="60" align="center" />
|
||||||
|
<el-table-column prop="material_code" label="物料编码" min-width="130" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="material_name" label="物料名称" min-width="160" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="spec" label="规格" min-width="120" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="unit" label="单位" width="70" align="center" />
|
||||||
|
<el-table-column prop="bom_qty" label="BOM用量" width="100" align="right" />
|
||||||
|
<el-table-column prop="use_bom_qty" label="已用数量" width="100" align="right" />
|
||||||
|
<el-table-column prop="wms_qty" label="WMS数量" width="100" align="right" />
|
||||||
|
<el-table-column prop="warehouse_name" label="仓库" min-width="120" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="load_port" label="上料口" width="90" align="center" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="work_center" label="工作中心" min-width="110" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="track_no" label="跟踪号" min-width="120" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="status" label="状态" width="80" align="center">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-tag :type="bomStatusTagType(scope.row.status)" size="mini">{{ bomStatusLabel(scope.row.status) }}</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<div slot="footer" class="dialog-footer">
|
||||||
|
<el-button size="mini" @click="closeDetailDialog">关闭</el-button>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
|
||||||
|
<!-- 主列表 -->
|
||||||
|
<el-table
|
||||||
|
ref="table"
|
||||||
|
v-loading="crud.loading"
|
||||||
|
:data="crud.data"
|
||||||
|
size="small"
|
||||||
|
border
|
||||||
|
row-key="id"
|
||||||
|
@selection-change="handleSelectionChange"
|
||||||
|
@expand-change="handleExpandChange"
|
||||||
|
>
|
||||||
|
<el-table-column type="selection" width="55" />
|
||||||
|
<el-table-column prop="id" label="ID" width="220" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="order_code" label="工单编号" min-width="150" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="product_code" label="产品编码" min-width="130" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="product_name" label="产品名称" min-width="160" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="product_spec" label="产品规格" min-width="120" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="order_qty" label="计划数量" width="90" align="right" />
|
||||||
|
<el-table-column prop="use_order_qty" label="已用数量" width="90" align="right" />
|
||||||
|
<el-table-column prop="finished_qty" label="完成数量" width="90" align="right" />
|
||||||
|
<el-table-column prop="unit" label="单位" width="70" align="center" />
|
||||||
|
<el-table-column prop="bom_code" label="BOM编码" min-width="130" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="work_area" label="工作区域" min-width="110" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="plan_started_on" label="计划开始" min-width="155" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="plan_finished_on" label="计划完成" min-width="155" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="status" label="状态" width="90" align="center">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-tag :type="statusTagType(scope.row.status)" size="mini">{{ statusLabel(scope.row.status) }}</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="create_time" label="创建时间" min-width="155" show-overflow-tooltip />
|
||||||
|
<el-table-column label="操作" width="210" align="center" fixed="right">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<udOperation style="display: inline" :data="scope.row" :permission="permission" />
|
||||||
|
<el-button size="mini" type="primary" plain style="margin-left: 4px;" @click="openDetailDialog(scope.row.order_code)">明细</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<pagination />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import crudWorkOrder from './workOrder'
|
||||||
|
import CRUD, { crud, form, header, presenter } from '@crud/crud'
|
||||||
|
import crudOperation from '@crud/CRUD.operation.vue'
|
||||||
|
import udOperation from '@crud/UD.operation.vue'
|
||||||
|
import rrOperation from '@crud/RR.operation.vue'
|
||||||
|
import pagination from '@crud/Pagination.vue'
|
||||||
|
|
||||||
|
const createDefaultForm = () => ({
|
||||||
|
id: null,
|
||||||
|
order_code: '',
|
||||||
|
product_code: '',
|
||||||
|
product_name: '',
|
||||||
|
product_spec: '',
|
||||||
|
order_qty: undefined,
|
||||||
|
unit: '',
|
||||||
|
bom_code: '',
|
||||||
|
work_area: '',
|
||||||
|
plan_started_on: '',
|
||||||
|
plan_finished_on: '',
|
||||||
|
status: undefined,
|
||||||
|
remark: ''
|
||||||
|
})
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'WorkOrder',
|
||||||
|
components: { pagination, crudOperation, rrOperation, udOperation },
|
||||||
|
mixins: [presenter(), header(), form(createDefaultForm()), crud()],
|
||||||
|
cruds() {
|
||||||
|
return CRUD({
|
||||||
|
title: '工单管理',
|
||||||
|
url: 'api/workOrder',
|
||||||
|
idField: 'id',
|
||||||
|
sort: 'plan_started_on,desc',
|
||||||
|
crudMethod: { ...crudWorkOrder },
|
||||||
|
optShow: { add: true, reset: true }
|
||||||
|
})
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
permission: {},
|
||||||
|
statusOptions: [
|
||||||
|
{ value: 1, label: '待执行' },
|
||||||
|
{ value: 2, label: '执行中' },
|
||||||
|
{ value: 3, label: '完成' },
|
||||||
|
{ value: 4, label: '暂停' },
|
||||||
|
{ value: 5, label: '撤销' }
|
||||||
|
],
|
||||||
|
bomStatusOptions: [
|
||||||
|
{ value: 0, label: '待备料' },
|
||||||
|
{ value: 1, label: '备料中' },
|
||||||
|
{ value: 2, label: '已备料' }
|
||||||
|
],
|
||||||
|
detailVisible: false,
|
||||||
|
detailLoading: false,
|
||||||
|
currentWorkOrder: {},
|
||||||
|
bomList: [],
|
||||||
|
multipleSelection: [],
|
||||||
|
rules: {
|
||||||
|
order_code: [{ required: true, message: '请输入工单编号', trigger: 'blur' }],
|
||||||
|
product_code: [{ required: true, message: '请输入产品编码', trigger: 'blur' }],
|
||||||
|
product_name: [{ required: true, message: '请输入产品名称', trigger: 'blur' }],
|
||||||
|
order_qty: [{ required: true, message: '请输入计划数量', trigger: 'change' }],
|
||||||
|
unit: [{ required: true, message: '请输入单位', trigger: 'blur' }],
|
||||||
|
bom_code: [{ required: true, message: '请输入BOM编码', trigger: 'blur' }]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
statusLabel(status) {
|
||||||
|
const target = this.statusOptions.find(item => Number(item.value) === Number(status))
|
||||||
|
return target ? target.label : status
|
||||||
|
},
|
||||||
|
statusTagType(status) {
|
||||||
|
const map = { 1: 'info', 2: 'primary', 3: 'success', 4: 'warning', 5: 'danger' }
|
||||||
|
return map[Number(status)] || ''
|
||||||
|
},
|
||||||
|
bomStatusLabel(status) {
|
||||||
|
const target = this.bomStatusOptions.find(item => Number(item.value) === Number(status))
|
||||||
|
return target ? target.label : (status !== undefined && status !== null ? status : '-')
|
||||||
|
},
|
||||||
|
bomStatusTagType(status) {
|
||||||
|
const map = { 0: 'info', 1: 'warning', 2: 'success' }
|
||||||
|
return map[Number(status)] || ''
|
||||||
|
},
|
||||||
|
handleSelectionChange(selection) {
|
||||||
|
this.multipleSelection = selection
|
||||||
|
},
|
||||||
|
handleExpandChange(row) {
|
||||||
|
// BOM data is already loaded with the row from the backend
|
||||||
|
},
|
||||||
|
openDetailDialog(order) {
|
||||||
|
crudWorkOrder.getItem(order).then(result => {
|
||||||
|
this.bomList = result.content || []
|
||||||
|
this.detailVisible = true
|
||||||
|
}).catch(error => {
|
||||||
|
this.bomList = []
|
||||||
|
}).finally(() => {
|
||||||
|
this.detailLoading = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
closeDetailDialog() {
|
||||||
|
this.detailVisible = false
|
||||||
|
this.currentWorkOrder = {}
|
||||||
|
this.bomList = []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
</style>
|
||||||
35
nladmin-ui/src/views/wms/pm_manage/work_order/workOrder.js
Normal file
35
nladmin-ui/src/views/wms/pm_manage/work_order/workOrder.js
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
export function add(data) {
|
||||||
|
return request({
|
||||||
|
url: 'api/workOrder',
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function del(ids) {
|
||||||
|
return request({
|
||||||
|
url: 'api/workOrder',
|
||||||
|
method: 'delete',
|
||||||
|
data: ids
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function edit(data) {
|
||||||
|
return request({
|
||||||
|
url: 'api/workOrder',
|
||||||
|
method: 'put',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
export function getItem(data) {
|
||||||
|
return request({
|
||||||
|
url: 'api/workOrder/getOrderItem',
|
||||||
|
method: 'get',
|
||||||
|
params: {
|
||||||
|
orderCode: data
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
export default { add, edit, del, getItem }
|
||||||
@@ -53,8 +53,8 @@
|
|||||||
<p v-if="scope.row.forwardZD == '0'">-</p>
|
<p v-if="scope.row.forwardZD == '0'">-</p>
|
||||||
<template v-else-if="scope.row.forwardZD == '1'">
|
<template v-else-if="scope.row.forwardZD == '1'">
|
||||||
<el-popconfirm
|
<el-popconfirm
|
||||||
confirm-button-text='是'
|
confirm-button-text="是"
|
||||||
cancel-button-text='否'
|
cancel-button-text="否"
|
||||||
icon="el-icon-info"
|
icon="el-icon-info"
|
||||||
icon-color="red"
|
icon-color="red"
|
||||||
title="是否重新转发中鼎?"
|
title="是否重新转发中鼎?"
|
||||||
@@ -63,17 +63,17 @@
|
|||||||
<a slot="reference" style="color: red;text-decoration: underline">失败</a>
|
<a slot="reference" style="color: red;text-decoration: underline">失败</a>
|
||||||
</el-popconfirm>
|
</el-popconfirm>
|
||||||
</template>
|
</template>
|
||||||
<!-- <a style="color: red;text-decoration: underline" v-else-if="scope.row.forwardZD == '1'">-->
|
<!-- <a style="color: red;text-decoration: underline" v-else-if="scope.row.forwardZD == '1'">-->
|
||||||
<!-- <el-popconfirm-->
|
<!-- <el-popconfirm-->
|
||||||
<!-- class="box-item"-->
|
<!-- class="box-item"-->
|
||||||
<!-- title="是否重新转发?"-->
|
<!-- title="是否重新转发?"-->
|
||||||
<!-- placement="top-start"-->
|
<!-- placement="top-start"-->
|
||||||
<!-- >-->
|
<!-- >-->
|
||||||
<!-- <template #reference>-->
|
<!-- <template #reference>-->
|
||||||
<!-- 失败-->
|
<!-- 失败-->
|
||||||
<!-- </template>-->
|
<!-- </template>-->
|
||||||
<!-- </el-popconfirm>-->
|
<!-- </el-popconfirm>-->
|
||||||
<!-- </a>-->
|
<!-- </a>-->
|
||||||
<p v-else>成功</p>
|
<p v-else>成功</p>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
@@ -90,8 +90,8 @@
|
|||||||
{{ formatDate(scope.row.modify_date) }}
|
{{ formatDate(scope.row.modify_date) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!-- <el-table-column prop="status" :formatter="auditStatusFormat" width="100" label="审核状态" />-->
|
<!-- <el-table-column prop="status" :formatter="auditStatusFormat" width="100" label="审核状态" />-->
|
||||||
<!-- <el-table-column show-overflow-tooltip prop="audit_msg" width="150" label="审核信息" />-->
|
<!-- <el-table-column show-overflow-tooltip prop="audit_msg" width="150" label="审核信息" />-->
|
||||||
</el-table>
|
</el-table>
|
||||||
<pagination />
|
<pagination />
|
||||||
</div>
|
</div>
|
||||||
@@ -166,7 +166,7 @@ export default {
|
|||||||
const s = String(d.getSeconds()).padStart(2, '0')
|
const s = String(d.getSeconds()).padStart(2, '0')
|
||||||
return y + '-' + m + '-' + day + ' ' + h + ':' + min + ':' + s
|
return y + '-' + m + '-' + day + ' ' + h + ':' + min + ':' + s
|
||||||
},
|
},
|
||||||
toForwardZD(){
|
toForwardZD() {
|
||||||
console.log(123)
|
console.log(123)
|
||||||
},
|
},
|
||||||
toView(index, row) {
|
toView(index, row) {
|
||||||
@@ -179,7 +179,7 @@ export default {
|
|||||||
// this.$refs.table.clearSelection()
|
// this.$refs.table.clearSelection()
|
||||||
// this.$refs.table.toggleRowSelection(val.pop())
|
// this.$refs.table.toggleRowSelection(val.pop())
|
||||||
this.audit_flag = true
|
this.audit_flag = true
|
||||||
}else {
|
} else {
|
||||||
this.audit_flag = false
|
this.audit_flag = false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ const zh = {
|
|||||||
'平库调拨出库',
|
'平库调拨出库',
|
||||||
'线边领料出库',
|
'线边领料出库',
|
||||||
'配盘出库',
|
'配盘出库',
|
||||||
|
'配盘入库'
|
||||||
// '空托上架/下架/注册/呼叫',
|
// '空托上架/下架/注册/呼叫',
|
||||||
// 'AGV配送',
|
// 'AGV配送',
|
||||||
// '人工盘点',
|
// '人工盘点',
|
||||||
|
|||||||
@@ -1,408 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="page-container">
|
|
||||||
<van-nav-bar
|
|
||||||
:title="t('productGroup.title')"
|
|
||||||
left-arrow
|
|
||||||
@click-left="router.push('/')"
|
|
||||||
/>
|
|
||||||
<div class="page-content">
|
|
||||||
<van-form ref="formRef">
|
|
||||||
<van-field
|
|
||||||
v-model="workSectText"
|
|
||||||
is-link
|
|
||||||
readonly
|
|
||||||
:label="t('productGroup.workSect')"
|
|
||||||
:placeholder="t('productGroup.workSectPlaceholder')"
|
|
||||||
:rules="[{ required: true, message: t('productGroup.workSectRequired') }]"
|
|
||||||
name="workSect"
|
|
||||||
@click="showWorkSectPicker = true"
|
|
||||||
/>
|
|
||||||
<van-field
|
|
||||||
v-model="palletCode"
|
|
||||||
:label="t('productGroup.palletCode')"
|
|
||||||
:placeholder="t('productGroup.palletCodePlaceholder')"
|
|
||||||
:rules="[{ required: true, message: t('productGroup.palletCodeRequired') }]"
|
|
||||||
name="palletCode"
|
|
||||||
clearable
|
|
||||||
>
|
|
||||||
<template #right-icon>
|
|
||||||
<van-icon name="scan" class="scan-icon" @click="onScanPallet" />
|
|
||||||
</template>
|
|
||||||
</van-field>
|
|
||||||
<van-field
|
|
||||||
v-model="workOrderText"
|
|
||||||
is-link
|
|
||||||
readonly
|
|
||||||
:label="t('productGroup.workOrder')"
|
|
||||||
:placeholder="t('productGroup.workOrderPlaceholder')"
|
|
||||||
:rules="[{ required: true, message: t('productGroup.workOrderRequired') }]"
|
|
||||||
name="workOrder"
|
|
||||||
@click="onWorkOrderClick"
|
|
||||||
/>
|
|
||||||
<van-field
|
|
||||||
v-model="loadPortText"
|
|
||||||
is-link
|
|
||||||
readonly
|
|
||||||
:label="t('productGroup.loadPort')"
|
|
||||||
:placeholder="t('productGroup.loadPortPlaceholder')"
|
|
||||||
:rules="[{ required: true, message: t('productGroup.loadPortRequired') }]"
|
|
||||||
name="loadPort"
|
|
||||||
@click="onLoadPortClick"
|
|
||||||
/>
|
|
||||||
</van-form>
|
|
||||||
|
|
||||||
<div class="detail-section">
|
|
||||||
<div class="detail-header">
|
|
||||||
<span class="detail-header-text">{{ t('productGroup.total', bomList.length) }}</span>
|
|
||||||
</div>
|
|
||||||
<div v-if="!bomList.length" class="detail-empty">
|
|
||||||
<van-empty :description="t('productGroup.noData')" image="search" />
|
|
||||||
</div>
|
|
||||||
<div v-else class="card-list">
|
|
||||||
<div
|
|
||||||
v-for="(item, idx) in bomList"
|
|
||||||
:key="idx"
|
|
||||||
class="detail-card"
|
|
||||||
>
|
|
||||||
<div class="card-header">
|
|
||||||
<span class="card-index">#{{ idx + 1 }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="card-row">
|
|
||||||
<span class="card-label">{{ t('productGroup.materialCode') }}</span>
|
|
||||||
<span class="card-value">{{ item.MaterialCode }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="card-row">
|
|
||||||
<span class="card-label">{{ t('productGroup.materialName') }}</span>
|
|
||||||
<span class="card-value">{{ item.MaterialName }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="card-row">
|
|
||||||
<span class="card-label">{{ t('productGroup.bomQty') }}</span>
|
|
||||||
<span class="card-value card-value--num">{{ item.BomQty }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="card-row">
|
|
||||||
<span class="card-label">{{ t('productGroup.useBomQty') }}</span>
|
|
||||||
<span class="card-value">{{ item.UseBomQty }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="card-row">
|
|
||||||
<span class="card-label">{{ t('productGroup.planQty') }}</span>
|
|
||||||
<span class="card-value card-value--num">{{ item.defaultQty }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="card-row card-row--input">
|
|
||||||
<span class="card-label">{{ t('productGroup.inputQty') }}</span>
|
|
||||||
<van-field
|
|
||||||
v-model="item.inputQty"
|
|
||||||
type="number"
|
|
||||||
class="card-input"
|
|
||||||
:placeholder="t('productGroup.inputQtyPlaceholder')"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div class="card-row">
|
|
||||||
<span class="card-label">{{ t('productGroup.unit') }}</span>
|
|
||||||
<span class="card-value">{{ item.Unit }}</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<van-popup v-model:show="showWorkSectPicker" round position="bottom">
|
|
||||||
<van-picker
|
|
||||||
:columns="workSectOptions"
|
|
||||||
@confirm="onWorkSectConfirm"
|
|
||||||
@cancel="showWorkSectPicker = false"
|
|
||||||
/>
|
|
||||||
</van-popup>
|
|
||||||
|
|
||||||
<van-popup v-model:show="showWorkOrderPicker" round position="bottom">
|
|
||||||
<van-picker
|
|
||||||
:columns="workOrderOptions"
|
|
||||||
@confirm="onWorkOrderConfirm"
|
|
||||||
@cancel="showWorkOrderPicker = false"
|
|
||||||
/>
|
|
||||||
</van-popup>
|
|
||||||
|
|
||||||
<van-popup v-model:show="showLoadPortPicker" round position="bottom">
|
|
||||||
<van-picker
|
|
||||||
:columns="loadPortOptions"
|
|
||||||
@confirm="onLoadPortConfirm"
|
|
||||||
@cancel="showLoadPortPicker = false"
|
|
||||||
/>
|
|
||||||
</van-popup>
|
|
||||||
|
|
||||||
<BottomButton :text="t('productGroup.confirm')" :loading="submitting" @click="onSubmit" />
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup>
|
|
||||||
import { ref, computed, watch, onMounted } from 'vue'
|
|
||||||
import { useRouter } from 'vue-router'
|
|
||||||
import { showToast } from 'vant'
|
|
||||||
import { useI18n } from '@/i18n'
|
|
||||||
import BottomButton from '@/components/BottomButton.vue'
|
|
||||||
import request from '@/utils/request'
|
|
||||||
|
|
||||||
const router = useRouter()
|
|
||||||
const { t } = useI18n()
|
|
||||||
|
|
||||||
const workSect = ref('')
|
|
||||||
const workSectText = ref('')
|
|
||||||
const palletCode = ref('')
|
|
||||||
const selectedOrderCode = ref('')
|
|
||||||
const workOrderText = ref('')
|
|
||||||
const selectedLoadPort = ref('')
|
|
||||||
const loadPortText = ref('')
|
|
||||||
const bomList = ref([])
|
|
||||||
const formRef = ref()
|
|
||||||
const submitting = ref(false)
|
|
||||||
|
|
||||||
const orderList = ref([])
|
|
||||||
const currentOrder = ref(null)
|
|
||||||
|
|
||||||
const showWorkSectPicker = ref(false)
|
|
||||||
const showWorkOrderPicker = ref(false)
|
|
||||||
const showLoadPortPicker = ref(false)
|
|
||||||
|
|
||||||
const workSectOptions = [
|
|
||||||
{ text: 'work1', value: 'work1' },
|
|
||||||
{ text: 'work2', value: 'work2' },
|
|
||||||
]
|
|
||||||
|
|
||||||
const workOrderOptions = computed(() =>
|
|
||||||
orderList.value.map((item) => ({
|
|
||||||
text: item.OrderCode,
|
|
||||||
value: item.OrderCode,
|
|
||||||
}))
|
|
||||||
)
|
|
||||||
|
|
||||||
const loadPortOptions = computed(() => {
|
|
||||||
if (!currentOrder.value || !currentOrder.value.PortList) return []
|
|
||||||
return currentOrder.value.PortList.map((p) => ({
|
|
||||||
text: p.Port,
|
|
||||||
value: p.Port,
|
|
||||||
}))
|
|
||||||
})
|
|
||||||
|
|
||||||
async function fetchWorkOrders() {
|
|
||||||
try {
|
|
||||||
const res = await request.get('/api/workOrder', { params: { status: 2 } })
|
|
||||||
orderList.value = res.content || []
|
|
||||||
} catch {
|
|
||||||
// error handled by interceptor
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function onWorkSectConfirm({ selectedOptions }) {
|
|
||||||
const opt = selectedOptions[0]
|
|
||||||
workSect.value = opt.value
|
|
||||||
workSectText.value = opt.text
|
|
||||||
showWorkSectPicker.value = false
|
|
||||||
}
|
|
||||||
|
|
||||||
function onWorkOrderClick() {
|
|
||||||
if (!workOrderOptions.value.length) {
|
|
||||||
showToast({ message: t('productGroup.noOrder'), type: 'fail' })
|
|
||||||
return
|
|
||||||
}
|
|
||||||
showWorkOrderPicker.value = true
|
|
||||||
}
|
|
||||||
|
|
||||||
function onWorkOrderConfirm({ selectedOptions }) {
|
|
||||||
const opt = selectedOptions[0]
|
|
||||||
selectedOrderCode.value = opt.value
|
|
||||||
workOrderText.value = opt.text
|
|
||||||
currentOrder.value = orderList.value.find((o) => o.OrderCode === opt.value) || null
|
|
||||||
selectedLoadPort.value = ''
|
|
||||||
loadPortText.value = ''
|
|
||||||
bomList.value = []
|
|
||||||
showWorkOrderPicker.value = false
|
|
||||||
}
|
|
||||||
|
|
||||||
function onLoadPortClick() {
|
|
||||||
if (!currentOrder.value || !loadPortOptions.value.length) {
|
|
||||||
showToast({ message: t('productGroup.noPort'), type: 'fail' })
|
|
||||||
return
|
|
||||||
}
|
|
||||||
showLoadPortPicker.value = true
|
|
||||||
}
|
|
||||||
|
|
||||||
function onLoadPortConfirm({ selectedOptions }) {
|
|
||||||
const opt = selectedOptions[0]
|
|
||||||
selectedLoadPort.value = opt.value
|
|
||||||
loadPortText.value = opt.text
|
|
||||||
filterBomList()
|
|
||||||
showLoadPortPicker.value = false
|
|
||||||
}
|
|
||||||
|
|
||||||
function filterBomList() {
|
|
||||||
if (!currentOrder.value || !selectedLoadPort.value) {
|
|
||||||
bomList.value = []
|
|
||||||
return
|
|
||||||
}
|
|
||||||
const allBom = currentOrder.value.WorkOrderBomList || []
|
|
||||||
bomList.value = allBom
|
|
||||||
.filter((item) => item.LoadPort === selectedLoadPort.value)
|
|
||||||
.map((item) => ({
|
|
||||||
...item,
|
|
||||||
defaultQty: item.BomQty - item.UseBomQty,
|
|
||||||
inputQty: String(item.BomQty - item.UseBomQty),
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
|
|
||||||
function onScanPallet() {
|
|
||||||
palletCode.value = 'PLT' + Date.now().toString().slice(-6)
|
|
||||||
}
|
|
||||||
|
|
||||||
async function onSubmit() {
|
|
||||||
try {
|
|
||||||
await formRef.value?.validate()
|
|
||||||
} catch {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if (!bomList.value.length) {
|
|
||||||
showToast({ message: t('productGroup.noData'), type: 'fail' })
|
|
||||||
return
|
|
||||||
}
|
|
||||||
const bomDataList = bomList.value.map((item) => ({
|
|
||||||
id: item.Id,
|
|
||||||
materialCode: item.MaterialCode,
|
|
||||||
unit: item.Unit,
|
|
||||||
useBomQty: Number(item.inputQty) || 0,
|
|
||||||
}))
|
|
||||||
submitting.value = true
|
|
||||||
try {
|
|
||||||
const res = await request.post('/api/productGroup', {
|
|
||||||
workSect: workSect.value,
|
|
||||||
workOrder: selectedOrderCode.value,
|
|
||||||
palletCode: palletCode.value,
|
|
||||||
loadPort: selectedLoadPort.value,
|
|
||||||
bomDataList,
|
|
||||||
})
|
|
||||||
showToast({
|
|
||||||
message: t('productGroup.submitSuccess'),
|
|
||||||
type: 'success',
|
|
||||||
})
|
|
||||||
workSect.value = ''
|
|
||||||
workSectText.value = ''
|
|
||||||
palletCode.value = ''
|
|
||||||
selectedOrderCode.value = ''
|
|
||||||
workOrderText.value = ''
|
|
||||||
selectedLoadPort.value = ''
|
|
||||||
loadPortText.value = ''
|
|
||||||
currentOrder.value = null
|
|
||||||
bomList.value = []
|
|
||||||
} catch {
|
|
||||||
// error handled by interceptor
|
|
||||||
} finally {
|
|
||||||
submitting.value = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onMounted(() => {
|
|
||||||
fetchWorkOrders()
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
.detail-section {
|
|
||||||
margin-top: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.detail-header {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
padding: 10px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.detail-header-text {
|
|
||||||
font-size: 14px;
|
|
||||||
color: #666;
|
|
||||||
font-weight: 600;
|
|
||||||
}
|
|
||||||
|
|
||||||
.detail-empty {
|
|
||||||
padding: 20px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-list {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: 10px;
|
|
||||||
padding-bottom: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.detail-card {
|
|
||||||
background: #fff;
|
|
||||||
border-radius: 8px;
|
|
||||||
overflow: hidden;
|
|
||||||
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.06);
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-header {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
padding: 8px 12px;
|
|
||||||
background: var(--primary-gradient);
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-index {
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 600;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-body {
|
|
||||||
padding: 10px 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-row {
|
|
||||||
display: flex;
|
|
||||||
align-items: flex-start;
|
|
||||||
padding: 4px 0;
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 1.5;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-row--input {
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-label {
|
|
||||||
flex-shrink: 0;
|
|
||||||
width: 80px;
|
|
||||||
color: #999;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-value {
|
|
||||||
flex: 1;
|
|
||||||
color: #333;
|
|
||||||
word-break: break-all;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-value--num {
|
|
||||||
color: var(--primary-color);
|
|
||||||
font-weight: 600;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-input {
|
|
||||||
flex: 1;
|
|
||||||
padding: 0;
|
|
||||||
background: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-input :deep(.van-field__control) {
|
|
||||||
font-size: 14px;
|
|
||||||
color: var(--primary-color);
|
|
||||||
font-weight: 600;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-input :deep(.van-field__body) {
|
|
||||||
padding: 2px 8px;
|
|
||||||
border: 1px solid var(--border-color);
|
|
||||||
border-radius: 4px;
|
|
||||||
background: #fff;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -34,5 +34,3 @@ CREATE TABLE IF NOT EXISTS `st_ivt_purchasedtl` (
|
|||||||
`instock_qty` DECIMAL(18,6) DEFAULT 0 COMMENT '已入库数量'
|
`instock_qty` DECIMAL(18,6) DEFAULT 0 COMMENT '已入库数量'
|
||||||
)COMMENT='采购入库单分录信息表';
|
)COMMENT='采购入库单分录信息表';
|
||||||
|
|
||||||
ALTER TABLE `wms_nlwq`.`st_ivt_purchasemst`
|
|
||||||
ADD COLUMN `forwardZD` tinyint(1) NULL DEFAULT 0 COMMENT '0否 1是' AFTER `audit_msg`;
|
|
||||||
Reference in New Issue
Block a user