From c81fc5e2a4f4153be2bb8602ed14a0743e6ecd29 Mon Sep 17 00:00:00 2001
From: chen.lin <1442464845@qq.com>
Date: 星期四, 05 三月 2026 11:14:50 +0800
Subject: [PATCH] RCS对接优化
---
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java | 12
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java | 51 ++++--
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaCheckOrderServiceImpl.java | 17 +
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaOutStockServiceImpl.java | 72 ++++++---
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaitPakinServiceImpl.java | 41 +++++
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReportMsgServiceImpl.java | 6
rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx | 7
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/ScheduleJobs.java | 6
rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx | 24 +-
rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx | 24 +-
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java | 106 +++++++++------
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/MaterialAutoSchedules.java | 10
12 files changed, 242 insertions(+), 134 deletions(-)
diff --git a/rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx b/rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx
index f62588a..a1a41c1 100644
--- a/rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx
+++ b/rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx
@@ -289,17 +289,19 @@
/>
</Grid>
- {dynamicFields.map((item) => {
- return (
- <Grid key={item.id} item xs={6} display="flex" gap={1}>
- <TextInput
- label={item.fieldsAlise}
- source={item.fields}
- validate={item.unique === 1 ? required() : false}
- />
- </Grid>
- )
- })}
+ {dynamicFields
+ .filter((item) => item.fields !== 'crushNo' && item.fieldsAlise !== '鐜板搧绁ㄥ彿')
+ .map((item) => {
+ return (
+ <Grid key={item.id} item xs={6} display="flex" gap={1}>
+ <TextInput
+ label={item.fieldsAlise}
+ source={item.fields}
+ validate={item.unique === 1 ? required() : false}
+ />
+ </Grid>
+ )
+ })}
<Grid item xs={6} display="flex" gap={1}>
<StatusSelectInput />
</Grid>
diff --git a/rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx b/rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx
index 0cf5299..ab1bb79 100644
--- a/rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx
+++ b/rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx
@@ -264,17 +264,19 @@
/>
</Grid>
- {dynamicFields.map((item) => {
- return (
- <Grid key={item.id} item xs={6} display="flex" gap={1}>
- <DynamicFields
- label={item.fieldsAlise}
- source={item.fields}
- validate={item.unique === 1 ? required() : false}
- />
- </Grid>
- )
- })}
+ {dynamicFields
+ .filter((item) => item.fields !== 'crushNo' && item.fieldsAlise !== '鐜板搧绁ㄥ彿')
+ .map((item) => {
+ return (
+ <Grid key={item.id} item xs={6} display="flex" gap={1}>
+ <DynamicFields
+ label={item.fieldsAlise}
+ source={item.fields}
+ validate={item.unique === 1 ? required() : false}
+ />
+ </Grid>
+ )
+ })}
</Grid>
diff --git a/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx b/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx
index 78c34a1..bf72fa3 100644
--- a/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx
+++ b/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx
@@ -167,6 +167,7 @@
data: { code, data, msg },
} = await request.get("/fields/enable/list");
if (code === 200) {
+ const dataFiltered = (data || []).filter(el => el.fields !== 'crushNo' && el.fieldsAlise !== '鐜板搧绁ㄥ彿');
const arr = [
<NumberField key="id" source="id" />,
<TextField key="code" source="code" label="table.field.matnr.code" />,
@@ -204,14 +205,14 @@
<BooleanField key="statusBool" source="statusBool" label="common.field.status" sortable={false} />,
<TextField key="memo" source="memo" label="common.field.memo" sortable={false} />,
]
- const fields = data.map(el => <TextField key={el.fields} source={`extendFields.[${el.fields}]`} label={el.fieldsAlise} />)
+ const fields = dataFiltered.map(el => <TextField key={el.fields} source={`extendFields.[${el.fields}]`} label={el.fieldsAlise} />)
const opt = <WrapperField key="opt" cellClassName="fixed" className="fixed" label="common.field.opt">
<EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
<PrintButton />
</WrapperField>
setColumns([...arr, ...fields, opt]);
- //filters娣诲姞杩囨护瀛楁
- data.map(el => {
+ //filters娣诲姞杩囨护瀛楁锛堟帓闄ょ幇鍝佺エ鍙凤級
+ dataFiltered.map(el => {
var i =0;
filters.map((item) =>{
if(item.key === el.fields){
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaCheckOrderServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaCheckOrderServiceImpl.java
index 946f9df..db47253 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaCheckOrderServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaCheckOrderServiceImpl.java
@@ -28,6 +28,7 @@
import com.vincent.rsf.server.system.service.impl.FieldsItemServiceImpl;
import com.vincent.rsf.server.system.service.impl.UserServiceImpl;
import com.vincent.rsf.server.system.utils.SerialRuleUtils;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -350,11 +351,17 @@
.setMaktx(matnr.getName())
.setAnfme(item.getCheckQty());
- FieldsItem fieldsItem = fieldsItemService.getOne(new LambdaQueryWrapper<FieldsItem>().eq(FieldsItem::getValue, item.getFieldsIndex()).last("limit 1"));
- if (Objects.isNull(fieldsItem)) {
- throw new CoolException("褰撳墠绁ㄥ彿涓嶅瓨鍦ㄥ簱瀛樹腑锛岃鎷垮嚭鍚庨噸鏂板叆搴擄紒锛�");
+ // 绁ㄥ彿鏆備笉浣跨敤锛屼笉鏍¢獙绁ㄥ彿鏄惁瀛樺湪
+ FieldsItem fieldsItem = null;
+ if (StringUtils.isNotBlank(item.getFieldsIndex())) {
+ fieldsItem = fieldsItemService.getOne(new LambdaQueryWrapper<FieldsItem>().eq(FieldsItem::getValue, item.getFieldsIndex()).last("limit 1"));
+ // if (Objects.isNull(fieldsItem)) {
+ // throw new CoolException("褰撳墠绁ㄥ彿涓嶅瓨鍦ㄥ簱瀛樹腑锛岃鎷垮嚭鍚庨噸鏂板叆搴擄紒锛�");
+ // }
}
- taskItem.setFieldsIndex(fieldsItem.getUuid());
+ if (fieldsItem != null) {
+ taskItem.setFieldsIndex(fieldsItem.getUuid());
+ }
taskItems.add(taskItem);
});
@@ -463,7 +470,7 @@
.setPDQty(taskItem.getAnfme())
.setEditUser(nickName)
.setEditDate(taskItem.getUpdateTime())
- .setGoodsNO(fields.get("crushNo"))
+ // .setGoodsNO(fields.get("crushNo")) // 绁ㄥ彿鏆備笉浣跨敤
.setIsBad(0 + "")
.setMemoDtl(taskItem.getMemo());
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaOutStockServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaOutStockServiceImpl.java
index 57332f5..8de29f8 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaOutStockServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaOutStockServiceImpl.java
@@ -231,9 +231,10 @@
if (Objects.isNull(param)) {
return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
}
- if (Objects.isNull(param.get("fieldsIndex"))) {
- return R.error("绁ㄥ彿涓嶈兘涓虹┖锛侊紒");
- }
+ // 绁ㄥ彿鏆備笉浣跨敤锛屾敞閲婃牎楠�
+ // if (Objects.isNull(param.get("fieldsIndex"))) {
+ // return R.error("绁ㄥ彿涓嶈兘涓虹┖锛侊紒");
+ // }
if (Objects.isNull(param.get("barcode"))) {
return R.error("鏂欑鐮佷笉鑳戒负绌猴紒锛�");
}
@@ -246,28 +247,42 @@
if (Objects.isNull(task)) {
throw new CoolException("鏁版嵁閿欒锛屼换鍔℃。宸蹭笉瀛樺湪锛侊紒");
}
- FieldsItem fieldsItem = fieldsItemService.getOne(new LambdaQueryWrapper<FieldsItem>()
- .eq(FieldsItem::getValue, param.get("fieldsIndex").toString())
- .last("limit 1"));
- if (Objects.isNull(fieldsItem)) {
- return R.error("鏁版嵁閿欒锛岀エ鍙蜂笉瀛樺湪锛侊紒");
- }
- TaskItem taskItem = taskItemService.getOne(new LambdaQueryWrapper<TaskItem>()
+ // 绁ㄥ彿鏆備笉浣跨敤锛屾寜浠诲姟鍙栫涓�鏉℃槑缁�
+ // FieldsItem fieldsItem = fieldsItemService.getOne(new LambdaQueryWrapper<FieldsItem>()
+ // .eq(FieldsItem::getValue, param.get("fieldsIndex").toString())
+ // .last("limit 1"));
+ // if (Objects.isNull(fieldsItem)) {
+ // return R.error("鏁版嵁閿欒锛岀エ鍙蜂笉瀛樺湪锛侊紒");
+ // }
+ TaskItem taskItem = null;
+ FieldsItem fieldsItem = null;
+ if (param.get("fieldsIndex") != null && StringUtils.isNotBlank(param.get("fieldsIndex").toString())) {
+ fieldsItem = fieldsItemService.getOne(new LambdaQueryWrapper<FieldsItem>()
+ .eq(FieldsItem::getValue, param.get("fieldsIndex").toString())
+ .last("limit 1"));
+ if (fieldsItem != null) {
+ taskItem = taskItemService.getOne(new LambdaQueryWrapper<TaskItem>()
.eq(TaskItem::getFieldsIndex, fieldsItem.getUuid())
- .eq(TaskItem::getTaskId, task.getId()));
+ .eq(TaskItem::getTaskId, task.getId()));
+ }
+ }
+ if (taskItem == null) {
+ taskItem = taskItemService.getOne(new LambdaQueryWrapper<TaskItem>()
+ .eq(TaskItem::getTaskId, task.getId())
+ .last("limit 1"));
+ }
if (Objects.isNull(taskItem)) {
return R.error("鏁版嵁閿欒锛屼换鍔℃。鏄庣粏涓嶅瓨鍦紒锛�");
}
-// Long orderId = Long.valueOf(param.get("orderId").toString());
-// List<WkOrderItem> orderItems = asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, orderId));
-// if (orderItems.isEmpty()) {
-// return R.error("鏁版嵁閿欒锛岃鍗曟暟鎹笉瀛樺湪锛侊紒");
-// }
- //鏍规嵁绱㈠紩鑾峰彇鍔ㄦ�佸瓧娈礦alue鍊�
- Map<String, String> fields = new HashMap<>();
- Fields fields1 = fieldsService.getById(fieldsItem.getFieldsId());
- fields.put(fields1.getFields(), fieldsItem.getValue());
- taskItem.setExtendFields(fields);
+ // 绁ㄥ彿鏆備笉浣跨敤锛氫粎褰撴湁 fieldsItem 鏃惰缃� extendFields
+ if (fieldsItem != null) {
+ Fields fields1 = fieldsService.getById(fieldsItem.getFieldsId());
+ if (fields1 != null) {
+ Map<String, String> fields = new HashMap<>();
+ fields.put(fields1.getFields(), fieldsItem.getValue());
+ taskItem.setExtendFields(fields);
+ }
+ }
return R.ok().add(taskItem);
}
@@ -373,10 +388,10 @@
throw new CoolException("缂撳瓨鏁版嵁涓㈠け锛侊紒");
}
Double v1 = Math.round((workItem.getAnfme() - serviceOne.getQty()) * 1000000) / 1000000.0;
- //涓嶇鏄惁鍏佽瓒呮敹锛岄兘闇�鍒ゆ柇鏄惁瓒呭嚭搴撳瓨鑼冨洿
- if (taskItem.getAnfme().compareTo(v1) > 0) {
- throw new CoolException("鎷h揣鏁伴噺瓒呭嚭褰撳墠绁ㄥ彿搴撳瓨鏁伴噺锛侊紒");
- }
+ //涓嶇鏄惁鍏佽瓒呮敹锛岄兘闇�鍒ゆ柇鏄惁瓒呭嚭搴撳瓨鑼冨洿锛堢エ鍙锋殏涓嶄娇鐢紝璇ュ垽鏂敞閲婏級
+ // if (taskItem.getAnfme().compareTo(v1) > 0) {
+ // throw new CoolException("鎷h揣鏁伴噺瓒呭嚭褰撳墠绁ㄥ彿搴撳瓨鏁伴噺锛侊紒");
+ // }
if (!Boolean.parseBoolean(config.getVal())) {
Double v = Math.round((item.getQty() + taskItem.getAnfme()) * 1000000) / 1000000.0;
if (item.getAnfme().compareTo(v) < 0.0) {
@@ -488,6 +503,9 @@
return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
}
for (TaskItem item : items) {
+ // 绁ㄥ彿鏆備笉浣跨敤锛岃烦杩囦慨鏀瑰嚭搴撲换鍔℃。鏄庣粏绁ㄥ彿閫昏緫
+ continue;
+ /*
if (Objects.isNull(item.getCrushNo())) {
continue;
}
@@ -496,7 +514,7 @@
Map<String, String> fields = FieldsUtils.getFields(byId.getFieldsIndex());
byId.setExtendFields(fields);
}
- if (byId.getExtendFields().get("crushNo").equals(item.getCrushNo())) {
+ if (byId.getExtendFields() != null && byId.getExtendFields().get("crushNo") != null && byId.getExtendFields().get("crushNo").equals(item.getCrushNo())) {
continue;
}
FieldsItem fieldsItem = fieldsItemService.getOne(new LambdaQueryWrapper<FieldsItem>()
@@ -530,7 +548,7 @@
//鏇存柊搴撲綅淇℃伅
locItemWorkingService.updateById(oldOne);
locItemWorkingService.updateById(one);
-
+ */
}
return R.ok();
}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReportMsgServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReportMsgServiceImpl.java
index 8902a11..b107cee 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReportMsgServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReportMsgServiceImpl.java
@@ -320,7 +320,7 @@
.setEditUser(nickName)
.setEditDate(order.getUpdateTime())
.setZone(stocks.getLocCode())
- .setGoodsNO(fields.get("crushNo"))
+ // .setGoodsNO(fields.get("crushNo")) // 绁ㄥ彿鏆備笉浣跨敤
.setMemoDtl(order.getMemo());
if (order.getWkType().equals(OrderWorkType.ORDER_WORK_TYPE_DONE_IN.type)) {
@@ -407,7 +407,7 @@
.setItemCode(stockItem.getMatnrCode())
.setEditUser(finalNickName)
.setEditDate(order.getUpdateTime())
- .setGoodsNO(fields.get("crushNo"))
+ // .setGoodsNO(fields.get("crushNo")) // 绁ㄥ彿鏆備笉浣跨敤
.setMemoDtl(order.getMemo());
if (order.getWkType().equals(OrderWorkType.ORDER_WORK_TYPE_DONE_IN.type)) {
//閲囪喘鍏ュ簱鍗�
@@ -520,7 +520,7 @@
.setItemCode(orderItem.getMatnrCode())
.setEditUser(nickName)
.setEditDate(order.getUpdateTime())
- .setGoodsNO(fields.get("crushNo"))
+ // .setGoodsNO(fields.get("crushNo")) // 绁ㄥ彿鏆備笉浣跨敤
.setMemoDtl(order.getMemo());
if (order.getWkType().equals(OrderWorkType.ORDER_WORK_TYPE_DONE_IN.type)) {
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java
index 13c551f..d2d1fc1 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java
@@ -322,22 +322,47 @@
// 2. 鑻ユ湭鍛戒腑鎷f枡/鐩樼偣鍏ュ簱锛屽啀鏍¢獙缁勬墭骞剁户缁叾浠栧叆搴撻�昏緫
if (pickInTask == null && checkInTask == null) {
- waitPakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>()
- .eq(WaitPakin::getBarcode, param.getBarcode())
- .in(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_DONE.val, PakinIOStatus.PAKIN_IO_STATUS_TASK_EXCE.val));
- // 绌烘墭鐩樻棤缁勬墭鏃讹細鑻ラ厤缃惎鐢ㄥ垯鎸� AUTO_FULL_OUT_MATNR_CODE 鑷姩缁勬墭骞剁敓鎴愬叆搴撳崟锛屽啀缁х画鍏ュ簱浠诲姟閫昏緫
- if (waitPakin == null) {
- tryAutoPakinForBarcode(param.getBarcode());
+ String barcode = param.getBarcode();
+ // 璇ユ墭鐩樺凡鍦ㄥ簱瀛樹腑锛屼笉鍙噸澶嶇敵璇峰叆搴�
+ List<Loc> inStock = locService.list(new LambdaQueryWrapper<Loc>().eq(Loc::getBarcode, barcode));
+ if (!inStock.isEmpty()) {
+ throw new CoolException("barcode=" + barcode + ": 璇ユ墭鐩樺凡鍦ㄥ簱锛屼笉鍙噸澶嶇敵璇峰叆搴�");
+ }
+ // 璇ユ墭鐩樺嚭搴撲腑鏈畬鎴愶紝涓嶅彲鐢宠鍏ュ簱
+ List<Integer> outboundTaskTypes = Arrays.asList(
+ TaskType.TASK_TYPE_OUT.type,
+ TaskType.TASK_TYPE_PICK_AGAIN_OUT.type,
+ TaskType.TASK_TYPE_MERGE_OUT.type,
+ TaskType.TASK_TYPE_CHECK_OUT.type,
+ TaskType.TASK_TYPE_EMPITY_OUT.type
+ );
+ Task outboundTask = taskService.getOne(new LambdaQueryWrapper<Task>()
+ .eq(Task::getBarcode, barcode)
+ .in(Task::getTaskType, outboundTaskTypes)
+ .lt(Task::getTaskStatus, TaskStsType.COMPLETE_OUT.id));
+ if (outboundTask != null) {
+ throw new CoolException("barcode=" + barcode + ": 璇ユ墭鐩樺嚭搴撲腑鏈畬鎴愶紝涓嶅彲鐢宠鍏ュ簱");
+ }
+
+ // 鎸� barcode 鍔犻攣锛岄伩鍏嶅悓涓� barcode 骞跺彂璇锋眰閲嶅鑷姩缁勬墭銆侀噸澶嶇敓鎴愬叆搴撳崟
+ String barcodeForLock = param.getBarcode();
+ synchronized ((barcodeForLock != null ? barcodeForLock : "").intern()) {
waitPakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>()
.eq(WaitPakin::getBarcode, param.getBarcode())
.in(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_DONE.val, PakinIOStatus.PAKIN_IO_STATUS_TASK_EXCE.val));
+ // 绌烘墭鐩樻棤缁勬墭鏃讹細鑻ラ厤缃惎鐢ㄥ垯鎸� AUTO_FULL_OUT_MATNR_CODE 鑷姩缁勬墭骞剁敓鎴愬叆搴撳崟锛屽啀缁х画鍏ュ簱浠诲姟閫昏緫
+ if (waitPakin == null) {
+ tryAutoPakinForBarcode(param.getBarcode());
+ waitPakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>()
+ .eq(WaitPakin::getBarcode, param.getBarcode())
+ .in(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_DONE.val, PakinIOStatus.PAKIN_IO_STATUS_TASK_EXCE.val));
+ }
}
waitPakin = validateWaitPakin(param.getBarcode());
waitPakinItems = waitPakinItemService.list(
new LambdaQueryWrapper<WaitPakinItem>().eq(WaitPakinItem::getPakinId, waitPakin.getId()));
}
- // 妫�鏌ュ叾浠栧叆搴撲换鍔$被鍨嬶紙鐢ㄧ鍙锋煡璇紝鐘舵�佷负1鎴�2锛�
- // 娉ㄦ剰锛氱洏鐐瑰叆搴撳凡鍗曠嫭澶勭悊锛屼笉鍐嶅寘鍚湪姝ゅ垪琛ㄤ腑
+ // 妫�鏌ヨ鎵樼洏鍙锋槸鍚﹀凡鏈夊叆搴撲换鍔★紙鍚繘琛屼腑銆佸凡瀹屾垚锛夛紝鏈夊垯鐩存帴澶嶇敤杩斿洖锛屾嫤鎴噸澶嶆彁浜�
List<Integer> otherInboundTaskTypes = Arrays.asList(
TaskType.TASK_TYPE_IN.type,
TaskType.TASK_TYPE_MERGE_IN.type,
@@ -347,48 +372,35 @@
Task existingInTask = taskService.getOne(new LambdaQueryWrapper<Task>()
.eq(Task::getBarcode, param.getBarcode())
.in(Task::getTaskType, otherInboundTaskTypes)
- .in(Task::getTaskStatus, TaskStsType.GENERATE_IN.id, TaskStsType.WCS_EXECUTE_IN.id)
.orderByDesc(Task::getCreateTime)
.last("LIMIT 1"));
if (Objects.nonNull(existingInTask)) {
- log.info("鎵惧埌鍖归厤鐨勫叾浠栧叆搴撲换鍔� - 浠诲姟缂栫爜锛歿}锛屼换鍔$被鍨嬶細{}锛岀鍙凤細{}",
- existingInTask.getTaskCode(), existingInTask.getTaskType(), param.getBarcode());
+ log.info("鎵惧埌璇ユ墭鐩樺彿宸叉湁鍏ュ簱浠诲姟锛屽鐢ㄥ苟鎷︽埅閲嶅鎻愪氦 - 浠诲姟缂栫爜锛歿}锛岀鍙凤細{}锛岀姸鎬侊細{}",
+ existingInTask.getTaskCode(), param.getBarcode(), existingInTask.getTaskStatus());
- // 妫�鏌ョ粍鎵樻槑缁嗘槸鍚︽湁璁㈠崟缂栫爜锛堜换鍔$紪鍙凤級
- List<WaitPakinItem> itemsWithAsnCode = waitPakinItems.stream()
- .filter(item -> StringUtils.isNotBlank(item.getAsnCode()))
- .collect(Collectors.toList());
-
- if (!itemsWithAsnCode.isEmpty()) {
- log.info("缁勬墭妗f湁浠诲姟缂栧彿锛屼娇鐢ㄧ幇鏈夊叆搴撲换鍔″崟鍙� - 浠诲姟缂栫爜锛歿}锛岀鍙凤細{}锛屼换鍔$紪鍙锋暟閲忥細{}",
- existingInTask.getTaskCode(), param.getBarcode(), itemsWithAsnCode.size());
-
- // 鏇存柊鍏ュ簱绔欑偣淇℃伅锛堝鏋滀笌褰撳墠鐢宠鐨勭珯鐐逛笉鍚岋級
- if (StringUtils.isNotBlank(param.getSourceStaNo()) &&
- !param.getSourceStaNo().equals(existingInTask.getOrgSite())) {
- log.info("鏇存柊鍏ュ簱浠诲姟鐨勫叆搴撶珯鐐� - 浠诲姟缂栫爜锛歿}锛屽師绔欑偣锛歿}锛屾柊绔欑偣锛歿}",
- existingInTask.getTaskCode(), existingInTask.getOrgSite(), param.getSourceStaNo());
- existingInTask.setOrgSite(param.getSourceStaNo());
- if (!taskService.updateById(existingInTask)) {
- log.warn("鏇存柊鍏ュ簱浠诲姟鐨勫叆搴撶珯鐐瑰け璐� - 浠诲姟缂栫爜锛歿}", existingInTask.getTaskCode());
- }
+ // 鏇存柊鍏ュ簱绔欑偣淇℃伅锛堝鏋滀笌褰撳墠鐢宠鐨勭珯鐐逛笉鍚岋級
+ if (StringUtils.isNotBlank(param.getSourceStaNo()) &&
+ !param.getSourceStaNo().equals(existingInTask.getOrgSite())) {
+ log.info("鏇存柊鍏ュ簱浠诲姟鐨勫叆搴撶珯鐐� - 浠诲姟缂栫爜锛歿}锛屽師绔欑偣锛歿}锛屾柊绔欑偣锛歿}",
+ existingInTask.getTaskCode(), existingInTask.getOrgSite(), param.getSourceStaNo());
+ existingInTask.setOrgSite(param.getSourceStaNo());
+ if (!taskService.updateById(existingInTask)) {
+ log.warn("鏇存柊鍏ュ簱浠诲姟鐨勫叆搴撶珯鐐瑰け璐� - 浠诲姟缂栫爜锛歿}", existingInTask.getTaskCode());
}
-
- // 杩斿洖鐜版湁鍏ュ簱浠诲姟鐨勪俊鎭�
- InTaskMsgDto msgDto = new InTaskMsgDto();
- msgDto.setWorkNo(existingInTask.getTaskCode());
- msgDto.setTaskId(existingInTask.getId());
- msgDto.setLocNo(existingInTask.getTargLoc());
- msgDto.setSourceStaNo(existingInTask.getOrgSite());
- msgDto.setStaNo(existingInTask.getTargSite());
- return msgDto;
- } else {
- log.info("缁勬墭妗f病鏈変换鍔$紪鍙凤紝缁х画鍒涘缓鏂颁换鍔� - 绠卞彿锛歿}", param.getBarcode());
}
- } else {
- log.info("鏈壘鍒板尮閰嶇殑鍏朵粬鍏ュ簱浠诲姟锛岀户缁垱寤烘柊浠诲姟 - 绠卞彿锛歿}", param.getBarcode());
+
+ // 鐩存帴杩斿洖宸叉湁浠诲姟淇℃伅锛屼笉鍐嶆柊寤轰换鍔�
+ InTaskMsgDto msgDto = new InTaskMsgDto();
+ msgDto.setWorkNo(existingInTask.getTaskCode());
+ msgDto.setTaskId(existingInTask.getId());
+ msgDto.setLocNo(existingInTask.getTargLoc());
+ msgDto.setSourceStaNo(existingInTask.getOrgSite());
+ msgDto.setStaNo(existingInTask.getTargSite());
+ return msgDto;
}
+
+ log.info("鏈壘鍒拌鎵樼洏鍙峰凡鏈夊叆搴撲换鍔★紝缁х画鍒涘缓鏂颁换鍔� - 绠卞彿锛歿}", param.getBarcode());
// 鐢熸垚浠诲姟缂栫爜
String ruleCode = generateTaskCode();
@@ -439,6 +451,14 @@
if (matnrConfig == null || StringUtils.isBlank(matnrConfig.getVal())) {
return;
}
+ // 浜屾纭锛氬凡鏈夎 barcode 鐨勭粍鎵樺垯鐩存帴杩斿洖锛岀敱澶栧眰澶嶇敤锛岄伩鍏嶉噸澶嶈姹傜敓鎴愬鏉″叆搴撳崟
+ WaitPakin existing = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>()
+ .eq(WaitPakin::getBarcode, barcode)
+ .in(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_DONE.val, PakinIOStatus.PAKIN_IO_STATUS_TASK_EXCE.val));
+ if (existing != null) {
+ log.info("[RCS鍏ュ簱鐢宠-鑷姩缁勬墭] barcode={} 宸叉湁缁勬墭锛岃烦杩囪嚜鍔ㄧ粍鎵�", barcode);
+ return;
+ }
Config qtyConfig = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.AUTO_PAKIN_QTY));
double autoQty = 1.0;
if (qtyConfig != null && StringUtils.isNotBlank(qtyConfig.getVal())) {
@@ -470,7 +490,7 @@
waitPakin = mobileService.mergeItems(param, 1L);
} catch (Exception e) {
log.warn("[RCS鍏ュ簱鐢宠-鑷姩缁勬墭] 缁勬墭澶辫触, barcode={}: {}", barcode, e.getMessage());
- return;
+ throw new CoolException("barcode=" + barcode + ": " + e.getMessage());
}
String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_ASN_ORDER, null);
if (StringUtils.isBlank(ruleCode)) {
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/MaterialAutoSchedules.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/MaterialAutoSchedules.java
index 4c56377..1dc30f9 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/MaterialAutoSchedules.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/MaterialAutoSchedules.java
@@ -65,10 +65,10 @@
private WaitPakinItemService waitPakinItemService;
/**
- * 瀹氭椂浠诲姟1锛氭寚瀹氱墿鏂欐湁搴撳瓨鏃惰嚜鍔ㄧ敓鎴愬叏鐗堝嚭搴撳崟锛堟瘡 2 鍒嗛挓锛�
+ * 瀹氭椂浠诲姟1锛氭寚瀹氱墿鏂欐湁搴撳瓨鏃惰嚜鍔ㄧ敓鎴愬叏鐗堝嚭搴撳崟
* 閰嶇疆锛欰UTO_FULL_OUT_MATNR_CODE锛堢墿鏂欑紪鐮侊級銆丄UTO_FULL_OUT_ENABLED锛坱rue 鍚敤锛�
*/
- @Scheduled(cron = "0 0/2 * * * ?")
+ @Scheduled(cron = "0/35 * * * * ?")
@Transactional(rollbackFor = Exception.class)
public void autoCreateFullOutOrder() {
Config enabledConfig = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.AUTO_FULL_OUT_ENABLED));
@@ -227,11 +227,11 @@
}
/**
- * 瀹氭椂浠诲姟3锛氭棤璁㈠崟缁勬墭 + 鑷姩鐢熸垚鍏ュ簱鍗曪紙浠呴拡瀵归厤缃墿鏂欙紝姣� 2 鍒嗛挓锛�
+ * 瀹氭椂浠诲姟3锛氭棤璁㈠崟缁勬墭 + 鑷姩鐢熸垚鍏ュ簱鍗曪紙浠呴拡瀵归厤缃墿鏂欙紝锛�
* 鍏堟寜閰嶇疆鐗╂枡涓庢暟閲忓仛鏃犺鍗曠粍鎵橈紝鍐嶇敓鎴愬叆搴撳崟骞跺叧鑱旂粍鎵樻槑缁嗭紝渚夸簬 RCS 鍏ュ簱闂幆銆�
* 閰嶇疆锛欰UTO_PAKIN_ON_ASN_ENABLED锛坱rue锛夈�丄UTO_FULL_OUT_MATNR_CODE銆丄UTO_PAKIN_QTY锛堟暟閲忥級
*/
- @Scheduled(cron = "0 0/2 * * * ?")
+ @Scheduled(cron = "0/35 * * * * ?")
@Transactional(rollbackFor = Exception.class)
public void autoPakinOnInbound() {
Config enabledConfig = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.AUTO_PAKIN_ON_ASN_ENABLED));
@@ -288,7 +288,7 @@
waitPakin = mobileService.mergeItems(param, SYSTEM_USER_ID);
} catch (Exception e) {
log.warn("[鏃犺鍗曡嚜鍔ㄧ粍鎵榏 缁勬墭澶辫触: {}", e.getMessage());
- return;
+ throw e; // 閲嶆柊鎶涘嚭锛岄伩鍏嶄簨鍔¤鏍囪 rollback-only 鍚庝粛灏濊瘯鎻愪氦瀵艰嚧 UnexpectedRollbackException
}
// 2锛夎嚜鍔ㄧ敓鎴愬叆搴撳崟锛堜竴鏉℃槑缁嗭紝閰嶇疆鐗╂枡 + 鏁伴噺锛�
String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_ASN_ORDER, null);
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/ScheduleJobs.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/ScheduleJobs.java
index de355f0..2f50b9b 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/ScheduleJobs.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/ScheduleJobs.java
@@ -18,6 +18,7 @@
import com.vincent.rsf.server.system.service.FieldsItemService;
import com.vincent.rsf.server.system.service.impl.FieldsItemServiceImpl;
import com.vincent.rsf.server.system.utils.SerialRuleUtils;
+import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -39,6 +40,7 @@
* @description
* @create 2025/3/3 15:38
*/
+@Slf4j
@Component
public class ScheduleJobs {
@@ -172,7 +174,9 @@
List<FieldsItem> fieldsList = fieldsItemService.list(new LambdaQueryWrapper<FieldsItem>().eq(FieldsItem::getUuid, orderItem.getFieldsIndex()).last("LIMIT 1"));
FieldsItem fieldsItem = fieldsList.isEmpty() ? null : fieldsList.get(0);
if (Objects.nonNull(fieldsItem)) {
- throw new CoolException("绁ㄥ彿锛�" + fieldsItem.getValue() + "宸插湪鏀惰揣鍖猴紝涓嶅彲鎺ㄩ�佺浉褰撶エ鍙锋暟鎹�傝鑱旂郴绠$悊鍛橈紒锛�");
+ // 绁ㄥ彿宸插湪鏀惰揣鍖烘椂璺宠繃鎺ㄩ�侊紝閬垮厤瀹氭椂浠诲姟鍙嶅鎶涢敊锛涜涓哄凡鏀惰揣锛岀敱鍚庣画閫昏緫鏇存柊鍗曟嵁鐘舵��
+ log.warn("绁ㄥ彿锛歿} 宸插湪鏀惰揣鍖猴紝璺宠繃鎺ㄩ��", fieldsItem.getValue());
+ return;
}
}
}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java
index b0f52cc..84c2299 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java
@@ -598,25 +598,40 @@
}
List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId()));
+ // 涓婃姤ERP鏆傛椂娉ㄩ噴锛�/rsf-open-api/erp/report/order锛�
+ // if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type)) {
+ // for (TaskItem taskItem : taskItems) {
+ // if (Objects.isNull(taskItem.getOrderId())) {
+ // continue;
+ // }
+ // WkOrder order = asnOrderService.getById(taskItem.getOrderId());
+ // if (Objects.isNull(order)) {
+ // continue;
+ // }
+ // // 鍏ュ簱鍗曚换鍔℃槑缁嗕笂鎶ワ細浼樺厛鎸� orderItemId锛堝崟鎹槑缁咺D锛夋煡锛屽惁鍒欐寜 orderId+matnrId(+fieldsIndex) 鏌ワ紝纭繚鑳芥壘鍒板崟鎹槑缁�
+ // WkOrderItem wkOrderItem = null;
+ // if (taskItem.getOrderItemId() != null) {
+ // wkOrderItem = asnOrderItemService.getById(taskItem.getOrderItemId());
+ // }
+ // if (wkOrderItem == null) {
+ // LambdaQueryWrapper<WkOrderItem> qw = new LambdaQueryWrapper<WkOrderItem>()
+ // .eq(WkOrderItem::getOrderId, order.getId())
+ // .eq(WkOrderItem::getMatnrId, taskItem.getMatnrId());
+ // if (StringUtils.isNotBlank(taskItem.getFieldsIndex())) {
+ // qw.eq(WkOrderItem::getFieldsIndex, taskItem.getFieldsIndex());
+ // }
+ // wkOrderItem = asnOrderItemService.getOne(qw);
+ // }
+ // if (Objects.isNull(wkOrderItem)) {
+ // logger.warn("浠诲姟鍘嗗彶妗e鐞嗭細鍗曟嵁鏄庣粏涓嶅瓨鍦ㄦ垨宸插畬鎴愶紝璺宠繃涓婃姤 - taskId={}, orderId={}, orderItemId={}, matnrId={}, fieldsIndex={}", task.getId(), order.getId(), taskItem.getOrderItemId(), taskItem.getMatnrId(), taskItem.getFieldsIndex());
+ // continue;
+ // }
+ // /**鍏ュ簱鍗曟槑缁嗕笂鎶�*/
+ // reportMsgService.reportOrderItem(wkOrderItem);
+ // }
+ // } else
if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type)) {
- for (TaskItem taskItem : taskItems) {
- if (Objects.isNull(taskItem.getOrderId())) {
- continue;
- }
- WkOrder order = asnOrderService.getById(taskItem.getOrderId());
- if (Objects.isNull(order)) {
- continue;
- }
- //鍏ュ簱鍗曚换鍔℃槑缁嗕笂鎶�
- WkOrderItem wkOrderItem = asnOrderItemService.getOne(new LambdaQueryWrapper<WkOrderItem>()
- .eq(WkOrderItem::getOrderId, order.getId())
- .eq(WkOrderItem::getFieldsIndex, taskItem.getFieldsIndex()));
- if (Objects.isNull(wkOrderItem)) {
- throw new CoolException("鏁版嵁閿欒锛屽崟鎹槑缁嗕笉瀛樺湪鎴栧凡瀹屾垚锛侊紒");
- }
- /**鍏ュ簱鍗曟槑缁嗕笂鎶�*/
- reportMsgService.reportOrderItem(wkOrderItem);
- }
+ // 鍏ュ簱绫诲瀷浠呰浆鍘嗗彶锛屼笉涓婃姤ERP锛堝凡娉ㄩ噴锛�
} else if ((task.getTaskType() >= TaskType.TASK_TYPE_OUT.type && task.getTaskType() <= TaskType.TASK_TYPE_EMPITY_OUT.type)
|| task.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type)) {
/**鍒ゆ柇鍗曟嵁鏄惁瀹屾垚锛氭尝娆′笅鍙戙�佹寜鍗曚笅鍙戯紙鐐瑰嚮涓嬪彂浠诲姟锛夊畬鎴愬悗鍧囧皢鍑哄簱鍗曠疆涓哄畬缁�*/
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
index 6ad6dfd..7c3e65e 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
@@ -2356,12 +2356,12 @@
locItemWrapper.and(wrapper -> wrapper.isNull(LocItem::getBatch).or().eq(LocItem::getBatch, ""));
}
- // 绁ㄥ彿鍖归厤锛氬鏋渢askItem鏈夌エ鍙凤紝鍒欏繀椤诲尮閰嶏紱濡傛灉taskItem娌℃湁绁ㄥ彿锛屽垯鏌ヨ绁ㄥ彿涓簄ull鎴栫┖瀛楃涓茬殑璁板綍
- if (StringUtils.isNotBlank(taskItem.getFieldsIndex())) {
- locItemWrapper.eq(LocItem::getFieldsIndex, taskItem.getFieldsIndex());
- } else {
- locItemWrapper.and(wrapper -> wrapper.isNull(LocItem::getFieldsIndex).or().eq(LocItem::getFieldsIndex, ""));
- }
+ // 绁ㄥ彿鏆備笉浣跨敤锛屼笉鎸夌エ鍙峰尮閰嶏紝鍙煡绁ㄥ彿涓� null 鎴栫┖鐨勫簱浣嶆槑缁�
+ // if (StringUtils.isNotBlank(taskItem.getFieldsIndex())) {
+ // locItemWrapper.eq(LocItem::getFieldsIndex, taskItem.getFieldsIndex());
+ // } else {
+ locItemWrapper.and(wrapper -> wrapper.isNull(LocItem::getFieldsIndex).or().eq(LocItem::getFieldsIndex, ""));
+ // }
LocItem locItem = locItemService.getOne(locItemWrapper);
if (Objects.isNull(locItem)) {
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaitPakinServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaitPakinServiceImpl.java
index b912340..5ff3493 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaitPakinServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaitPakinServiceImpl.java
@@ -115,8 +115,44 @@
List<WaitPakinItem> items = new ArrayList<>();
if (directWaitPakin) {
- // DirectWaitPakin 鍚敤锛氱粍鎵樻潵鑷敹璐у尯锛宲aram 涓� id 涓� WarehouseAreasItem.id
+ // DirectWaitPakin 鍚敤锛氱粍鎵樺彲鏉ヨ嚜鏀惰揣鍖猴紙鏈� id锛夋垨鏃犺鍗曠粍鎵橈紙id 涓� null锛屼粎鐗╂枡+鏁伴噺锛�
for (PakinItem pakinItem1 : waitPakin.getItems()) {
+ if (pakinItem1.getId() == null) {
+ // 鏃犺鍗曠粍鎵橈細鏃犳敹璐у尯鏉ユ簮锛屾寜 matnrId + receiptQty 寤虹粍鎵樻槑缁�
+ if (pakinItem1.getMatnrId() == null) {
+ throw new CoolException("鏃犺鍗曠粍鎵樻椂鐗╂枡ID涓嶈兘涓虹┖锛侊紒");
+ }
+ Matnr matnr = matnrMapper.selectById(pakinItem1.getMatnrId());
+ if (matnr == null) {
+ throw new CoolException("鐗╂枡淇℃伅涓嶅瓨鍦紝鐗╂枡ID锛�" + pakinItem1.getMatnrId());
+ }
+ if (pakinItem1.getReceiptQty() == null || pakinItem1.getReceiptQty().compareTo(0.0) <= 0) {
+ throw new CoolException("缁勬墭鏁伴噺涓嶈兘灏忎簬绛変簬闆讹紒锛�");
+ }
+ WaitPakinItem pakinItem = new WaitPakinItem();
+ pakinItem.setPakinId(waitPakin1.getId())
+ .setSource(null)
+ .setAsnId(null)
+ .setAsnCode(null)
+ .setAsnItemId(null)
+ .setIsptResult(null)
+ .setPlatItemId(null)
+ .setPlatOrderCode(null)
+ .setPlatWorkCode(null)
+ .setProjectCode(null)
+ .setBatch(null)
+ .setUnit(matnr.getStockUnit() != null ? matnr.getStockUnit() : "涓�")
+ .setFieldsIndex(matnr.getFieldsIndex())
+ .setMatnrId(matnr.getId())
+ .setMaktx(matnr.getName())
+ .setUpdateBy(userId)
+ .setCreateBy(userId)
+ .setMatnrCode(matnr.getCode())
+ .setAnfme(QuantityUtils.roundToScale(pakinItem1.getReceiptQty()))
+ .setTrackCode(pakinItem1.getTrackCode());
+ items.add(pakinItem);
+ continue;
+ }
WarehouseAreasItem areaItem = warehouseAreasItemService.getById(pakinItem1.getId());
if (areaItem == null) {
throw new CoolException("鐗╂枡鏈�佽嚦鏀惰揣鍖猴紒锛�");
@@ -157,6 +193,9 @@
throw new CoolException("缁勬墭鏄庣粏淇濆瓨澶辫触锛侊紒");
}
for (WaitPakinItem pakinItem : items) {
+ if (pakinItem.getSource() == null) {
+ continue; // 鏃犺鍗曠粍鎵樻棤鏀惰揣鍖烘潵婧愶紝涓嶆洿鏂版敹璐у尯
+ }
WarehouseAreasItem one = warehouseAreasItemService.getOne(new LambdaQueryWrapper<WarehouseAreasItem>().eq(WarehouseAreasItem::getId, pakinItem.getSource()));
if (one == null) {
throw new CoolException("鏀惰揣鍖烘暟鎹敊璇紒锛�");
--
Gitblit v1.9.1