From 08cd807032b661ec5061ab822ccbf53b41d7d438 Mon Sep 17 00:00:00 2001
From: Junjie <540245094@qq.com>
Date: 星期二, 03 十二月 2024 14:12:53 +0800
Subject: [PATCH] #库位移转

---
 zy-asrs-admin/src/views/loc/stockTransfer/index.vue                               |  326 +++++++++++++++++++++++++++++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/WorkController.java     |   21 +
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java  |  141 ++++++++++++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskTimer.java               |   85 +++++++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/LocTransferParam.java |   15 +
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/WorkService.java           |    4 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocController.java      |   22 ++
 7 files changed, 610 insertions(+), 4 deletions(-)

diff --git a/zy-asrs-admin/src/views/loc/stockTransfer/index.vue b/zy-asrs-admin/src/views/loc/stockTransfer/index.vue
new file mode 100644
index 0000000..328494c
--- /dev/null
+++ b/zy-asrs-admin/src/views/loc/stockTransfer/index.vue
@@ -0,0 +1,326 @@
+<script setup>
+import { ref, reactive } from 'vue';
+import { useRouter } from "vue-router";
+import { get, post, postForm } from '@/utils/request.js'
+import { message, Modal } from 'ant-design-vue';
+import { logout } from '@/config.js';
+import { formatMessage } from '@/utils/localeUtils.js';
+import useTableSearch from '@/utils/tableUtils.jsx';
+import MatQueryView from '@/components/mat/matQuery/index.vue'
+
+const router = useRouter();
+
+const TABLE_KEY = 'table-locDetl';
+const matQueryChild = ref(null)
+const sourceLocNo = ref(null)
+const targetLocNo = ref(null)
+
+let tableData = ref([]);
+getColumns();
+
+const {
+    getColumnSearchProps,
+    handleResizeColumn,
+} = useTableSearch();
+
+const state = reactive({
+    selectedRowKeys: [],
+    loading: false,
+    columns: [],
+});
+const onSelectChange = selectedRowKeys => {
+    // console.log('selectedRowKeys changed: ', selectedRowKeys);
+    state.selectedRowKeys = selectedRowKeys;
+};
+
+state.columns = [
+    {
+        title: formatMessage('db.man_loc_detl.loc_no', '搴撲綅鍙�'),
+        dataIndex: 'locNo',
+        width: 140,
+        ellipsis: true,
+        ...getColumnSearchProps('locNo'),
+    },
+    {
+        title: formatMessage('db.man_loc_detl.matnr', '鍟嗗搧缂栧彿'),
+        dataIndex: 'matnr',
+        width: 140,
+        ellipsis: true,
+        ...getColumnSearchProps('matnr'),
+    },
+    {
+        title: formatMessage('db.man_loc_detl.batch', '鎵瑰彿'),
+        dataIndex: 'batch',
+        width: 140,
+        ellipsis: true,
+        ...getColumnSearchProps('batch'),
+    },
+    {
+        title: formatMessage('db.man_loc_detl.anfme', '搴撳瓨鏁伴噺'),
+        dataIndex: 'anfme',
+        width: 140,
+        ellipsis: true,
+    },
+];
+
+let columnsOther = [
+    // {
+    //     title: formatMessage('db.man_loc_detl.loc_id', '搴撲綅'),
+    //     dataIndex: 'locId$',
+    //     width: 140,
+    //     ellipsis: true,
+    //     ...getColumnSearchProps('locId$'),
+    // },
+    // {
+    //     title: formatMessage('db.man_loc_detl.mat_id', '鍟嗗搧'),
+    //     dataIndex: 'matId$',
+    //     width: 140,
+    //     ellipsis: true,
+    //     ...getColumnSearchProps('matId$'),
+    // },
+    {
+        title: formatMessage('db.man_loc_detl.order_no', '璁㈠崟鍙�'),
+        dataIndex: 'orderNo',
+        width: 140,
+        ellipsis: true,
+        ...getColumnSearchProps('orderNo'),
+    },
+    {
+        title: formatMessage('db.man_loc_detl.anfme', '鏁伴噺'),
+        dataIndex: 'anfme',
+        width: 140,
+        ellipsis: true,
+        ...getColumnSearchProps('anfme'),
+    },
+    {
+        title: formatMessage('db.man_loc_detl.freeze', '鏄惁鍐荤粨'),
+        dataIndex: 'freeze$',
+        width: 140,
+        ellipsis: true,
+        ...getColumnSearchProps('freeze$'),
+    },
+    // {
+    //     title: formatMessage('db.man_loc_detl.status', '鐘舵��'),
+    //     dataIndex: 'status$',
+    //     width: 140,
+    //     ellipsis: true,
+    //     ...getColumnSearchProps('status$'),
+    // },
+    // {
+    //   title: formatMessage('db.man_loc_detl.create_time', '娣诲姞鏃堕棿'),
+    //   dataIndex: 'createTime$',
+    //   width: 140,
+    //   ellipsis: true,
+    //   ...getColumnSearchProps('createTime$'),
+    // },
+    // {
+    //   title: formatMessage('db.man_loc_detl.create_by', '娣诲姞浜哄憳'),
+    //   dataIndex: 'createBy$',
+    //   width: 140,
+    //   ellipsis: true,
+    //   ...getColumnSearchProps('createBy$'),
+    // },
+    // {
+    //     title: formatMessage('db.man_loc_detl.update_time', '淇敼鏃堕棿'),
+    //     dataIndex: 'updateTime$',
+    //     width: 140,
+    //     ellipsis: true,
+    //     ...getColumnSearchProps('updateTime$'),
+    // },
+    // {
+    //     title: formatMessage('db.man_loc_detl.update_by', '淇敼浜哄憳'),
+    //     dataIndex: 'updateBy$',
+    //     width: 140,
+    //     ellipsis: true,
+    //     ...getColumnSearchProps('updateBy$'),
+    // },
+    {
+        title: formatMessage('db.man_loc_detl.memo', '澶囨敞'),
+        dataIndex: 'memo',
+        width: 140,
+        ellipsis: true,
+        ...getColumnSearchProps('memo'),
+    },
+]
+
+let fieldList = [];
+//鍔犺浇鎵╁睍瀛楁
+async function getColumns() {
+    let fieldResp = await post('/api/matField/list', {
+        unique: 1
+    })
+    let fieldResult = fieldResp.data;
+    let tmp = state.columns;
+    if (fieldResult.code == 200) {
+        let data = fieldResult.data;
+        data.forEach((item) => {
+            let filed = {
+                title: formatMessage(item.language, item.describe),
+                name: item.name,
+                dataIndex: item.name,
+                key: item.name,
+                width: 140,
+                editable: true,
+                ...getColumnSearchProps(item.name),
+            }
+            tmp.push(filed)
+            fieldList.push(filed)
+        })
+
+        tmp = tmp.concat(columnsOther)
+
+        state.columns = tmp;
+    } else if (result.code === 401) {
+        message.error(result.msg);
+        logout()
+    } else {
+        message.error(result.msg);
+    }
+}
+
+const handleMatQueryOk = (result) => {
+    let tmp = [];
+
+    if (tableData.value != undefined) {
+        tmp = [...tableData.value]
+    }
+
+    for (let i = 0; i < result.length; i++) {
+        let item = result[i]
+        item.anfme = 0;
+        item.qty = 0;
+        item.matId = item.id;
+        item.id = null;
+
+        fieldList.forEach((filed) => {
+            item[filed.key] = ''
+        })
+
+        tmp.push(item)
+    }
+
+    tableData.value = tmp;
+}
+
+const onSourceLocNoChange = () => {
+    state.loading = true;
+    tableData.value = null;
+
+    postForm('/api/loc/search/like/locNo', {
+        locNo: sourceLocNo.value,
+    }).then(resp => {
+        let result = resp.data;
+        if (result.code == 200) {
+            let detls = [];
+            result.data.forEach((item) => {
+                item.qty = item.anfme;
+                detls.push(item)
+            })
+            tableData.value = detls;
+            state.loading = false;
+        } else {
+            message.error(result.msg);
+            tableData.value = null;
+        }
+    })
+}
+
+const submitTransfer = () => {
+    Modal.confirm({
+        title: formatMessage('page.stockTransfer.transfer', '搴撳瓨绉昏浆'),
+        content: formatMessage('page.stockTransfer.confirm', '纭畾搴撳瓨绉昏浆鍚楋紵'),
+        maskClosable: true,
+        onOk: async () => {
+            confirmTransfer()
+        },
+    });
+
+}
+
+const confirmTransfer = () => {
+    if (sourceLocNo.value == null) {
+        message.error(formatMessage('page.stockTransfer.sourceLocNoNull', '璇疯緭鍏ユ簮搴撲綅'));
+        return;
+    }
+
+    if(targetLocNo.value == null) {
+        message.error(formatMessage('page.stockTransfer.targetLocNoNull', '鐩爣搴撲綅涓虹┖'));
+        return;
+    }
+
+    post('/api/loc/transfer', {
+        sourceLocNo: sourceLocNo.value,
+        targetLocNo: targetLocNo.value
+    }).then(resp => {
+        let result = resp.data;
+        if (result.code == 200) {
+            message.success(formatMessage('page.stockTransfer.success', '搴撳瓨绉昏浆鎴愬姛'));
+
+            sourceLocNo.value = null;
+            targetLocNo.value = null;
+        } else {
+            message.error(result.msg);
+        }
+    })
+}
+
+const locNoQueryList = ref(null);
+locNoQuery("");
+function locNoQuery(locNo) {
+    postForm('/api/loc/search/empty/locNo', {
+        locNo: locNo
+    }).then(resp => {
+        let result = resp.data;
+        let tmp = []
+        result.data.forEach((item) => {
+            tmp.push({
+                value: item.locNo,
+                label: item.locNo
+            })
+        })
+        locNoQueryList.value = tmp;
+    })
+}
+
+const locNoSearch = (val) => {
+    locNoQuery(val)
+}
+
+</script>
+
+<script>
+export default {
+    name: '搴撳瓨绉昏浆'
+}
+</script>
+
+<template>
+    <div>
+        <div style="margin-bottom: 20px;display: flex;align-items: center;">
+            <a-input v-model:value="sourceLocNo" :placeholder="formatMessage('page.stockTransfer.sourceLocNo', '婧愬簱浣�')"
+                style="width: 200px;" @change="onSourceLocNoChange" />
+            <span style="margin-left: 10px;margin-right: 10px;">-</span>
+            <a-select v-model:value="targetLocNo" :placeholder="formatMessage('page.stockTransfer.targetLocNo', '鐩爣搴撲綅')"
+                style="width: 200px" show-search :options="locNoQueryList" @search="locNoSearch" optionFilterProp="label"
+                optionLabelProp="label">
+            </a-select>
+        </div>
+        <div class="table-header">
+            <div>
+                <a-button type="primary" @click="submitTransfer">搴撲綅绉昏浆</a-button>
+            </div>
+        </div>
+        <a-table :row-selection="{ selectedRowKeys: state.selectedRowKeys, onChange: onSelectChange }"
+            :data-source="tableData" :defaultExpandAllRows="false" :key="TABLE_KEY" rowKey="id"
+            :scroll="{ y: 768, scrollToFirstRowOnChange: true }" :columns="state.columns" :loading="state.loading"
+            @resizeColumn="handleResizeColumn">
+            <template #bodyCell="{ column, text, record }">
+
+            </template>
+        </a-table>
+
+        <MatQueryView ref="matQueryChild" @handle-ok="handleMatQueryOk" />
+    </div>
+</template>
+
+<style></style>
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocController.java
index 38a0079..fba74c9 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocController.java
@@ -5,6 +5,7 @@
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
 import com.zy.asrs.wms.asrs.entity.LocDetl;
+import com.zy.asrs.wms.asrs.entity.enums.LocStsType;
 import com.zy.asrs.wms.asrs.service.LocDetlService;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
@@ -66,6 +67,27 @@
         return R.ok().add(map);
     }
 
+    @PreAuthorize("hasAuthority('asrs:loc:list')")
+    @PostMapping("/loc/search/like/locNo")
+    public R search(@RequestParam("locNo") String locNo) {
+        if (Cools.isEmpty(locNo)) {
+            return R.ok().add(new ArrayList<>());
+        }
+        List<LocDetl> locDetls = locDetlService.list(new LambdaQueryWrapper<LocDetl>().like(LocDetl::getLocNo, locNo));
+        locDetls = locDetlService.parseLocDetl(locDetls);
+        return R.ok().add(locDetls);
+    }
+
+    @PreAuthorize("hasAuthority('asrs:loc:list')")
+    @PostMapping("/loc/search/empty/locNo")
+    public R searchEmpty(@RequestParam("locNo") String locNo) {
+        if (Cools.isEmpty(locNo)) {
+            return R.ok().add(locService.list(new LambdaQueryWrapper<Loc>().eq(Loc::getLocStsId, LocStsType.O.val())));
+        }
+        List<Loc> list = locService.list(new LambdaQueryWrapper<Loc>().eq(Loc::getLocStsId, LocStsType.O.val()).like(Loc::getLocNo, locNo));
+        return R.ok().add(list);
+    }
+
     @PreAuthorize("hasAuthority('asrs:loc:save')")
     @OperationLog("娣诲姞搴撲綅")
     @PostMapping("/loc/save")
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/WorkController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/WorkController.java
index cf6b603..2e6e97b 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/WorkController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/WorkController.java
@@ -5,12 +5,13 @@
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
 import com.zy.asrs.framework.exception.CoolException;
-import com.zy.asrs.wms.asrs.entity.Loc;
-import com.zy.asrs.wms.asrs.entity.LocDetl;
-import com.zy.asrs.wms.asrs.entity.LocDetlField;
-import com.zy.asrs.wms.asrs.entity.MatField;
+import com.zy.asrs.wms.asrs.entity.*;
+import com.zy.asrs.wms.asrs.entity.enums.LocStsType;
+import com.zy.asrs.wms.asrs.entity.enums.OrderSettleType;
+import com.zy.asrs.wms.asrs.entity.enums.TaskStsType;
 import com.zy.asrs.wms.asrs.entity.param.GeneratePakInParam;
 import com.zy.asrs.wms.asrs.entity.param.LocAdjustParam;
+import com.zy.asrs.wms.asrs.entity.param.LocTransferParam;
 import com.zy.asrs.wms.asrs.service.*;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.system.controller.BaseController;
@@ -118,4 +119,16 @@
         return R.ok();
     }
 
+    @OperationLog("搴撳瓨绉昏浆")
+    @PostMapping("/loc/transfer")
+    @Transactional
+    public R locTransfer(@RequestBody LocTransferParam param) {
+        try {
+            workService.locTransfer(param);
+            return R.ok();
+        } catch (Exception e) {
+            return R.error(e.getMessage());
+        }
+    }
+
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/LocTransferParam.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/LocTransferParam.java
new file mode 100644
index 0000000..74b10d0
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/LocTransferParam.java
@@ -0,0 +1,15 @@
+package com.zy.asrs.wms.asrs.entity.param;
+
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class LocTransferParam {
+
+    private String sourceLocNo;
+
+    private String targetLocNo;
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/WorkService.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/WorkService.java
index dbde948..bd47a2d 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/WorkService.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/WorkService.java
@@ -3,6 +3,7 @@
 import com.zy.asrs.wms.asrs.entity.Loc;
 import com.zy.asrs.wms.asrs.entity.param.FieldParam;
 import com.zy.asrs.wms.asrs.entity.param.GeneratePakInParam;
+import com.zy.asrs.wms.asrs.entity.param.LocTransferParam;
 
 import java.util.List;
 
@@ -38,4 +39,7 @@
     //鎷f枡浠诲姟
     boolean pickTask(Long taskId);
 
+    //搴撲綅绉昏浆
+    boolean locTransfer(LocTransferParam param);
+
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java
index 97ceb6c..cdbe93b 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java
@@ -1,11 +1,14 @@
 package com.zy.asrs.wms.asrs.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zy.asrs.framework.common.Cools;
+import com.zy.asrs.framework.common.R;
 import com.zy.asrs.framework.exception.CoolException;
 import com.zy.asrs.wms.asrs.entity.*;
 import com.zy.asrs.wms.asrs.entity.enums.*;
 import com.zy.asrs.wms.asrs.entity.param.FieldParam;
 import com.zy.asrs.wms.asrs.entity.param.GeneratePakInParam;
+import com.zy.asrs.wms.asrs.entity.param.LocTransferParam;
 import com.zy.asrs.wms.asrs.service.*;
 import com.zy.asrs.wms.utils.LocUtils;
 import com.zy.asrs.wms.utils.OrderUtils;
@@ -37,6 +40,10 @@
     private OrderDetlService orderDetlService;
     @Autowired
     private LocService locService;
+    @Autowired
+    private LocDetlService locDetlService;
+    @Autowired
+    private LocDetlFieldService locDetlFieldService;
     @Autowired
     private LocStsService locStsService;
     @Autowired
@@ -499,8 +506,35 @@
                         throw new CoolException("娉㈡鏄庣粏鏇存柊澶辫触");
                     }
                 }
+                break;
+            case 11://搴撲綅绉昏浆
+                Loc originLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, task.getOriginLoc()));
+                if(originLoc == null){
+                    throw new CoolException("婧愬簱浣嶄笉瀛樺湪");
+                }
+                if (originLoc.getLocStsId() != LocStsType.R.val()) {
+                    throw new CoolException("婧愬簱浣嶇姸鎬佷笉澶勪簬R.鍑哄簱棰勭害");
+                }
 
+                loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, task.getTargetLoc()));
+                if(loc == null){
+                    throw new CoolException("鐩爣搴撲綅涓嶅瓨鍦�");
+                }
+                if(loc.getLocStsId() != LocStsType.S.val()){
+                    throw new CoolException("鐩爣搴撲綅鐘舵�佷笉澶勪簬S.鍏ュ簱棰勭害");
+                }
 
+                originLoc.setLocStsId(LocStsType.F.val());
+                originLoc.setUpdateTime(new Date());
+                if(!locService.updateById(originLoc)){
+                    throw new CoolException("搴撲綅鐘舵�佸彉鏇村け璐�");
+                }
+
+                loc.setLocStsId(LocStsType.O.val());
+                loc.setUpdateTime(new Date());
+                if(!locService.updateById(loc)){
+                    throw new CoolException("搴撲綅鐘舵�佸彉鏇村け璐�");
+                }
                 break;
         }
 
@@ -650,4 +684,111 @@
 
         return true;
     }
+
+    @Override
+    public boolean locTransfer(LocTransferParam param) {
+        if (param == null) {
+            throw new CoolException("鍙傛暟涓嶈兘涓虹┖");
+        }
+
+        if (Cools.isEmpty(param.getSourceLocNo())) {
+            throw new CoolException("婧愬簱浣嶄笉鑳戒负绌�");
+        }
+
+        if (Cools.isEmpty(param.getTargetLocNo())) {
+            throw new CoolException("鐩爣搴撲綅涓嶈兘涓虹┖");
+        }
+
+        Loc sourceLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, param.getSourceLocNo()));
+        if (sourceLoc == null) {
+            throw new CoolException("婧愬簱浣嶄笉瀛樺湪");
+        }
+
+        if (sourceLoc.getLocStsId() != LocStsType.F.val()) {
+            throw new CoolException("婧愬簱浣嶉潪鍦ㄥ簱鐘舵��");
+        }
+
+        Loc targetLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, param.getTargetLocNo()));
+        if (targetLoc == null) {
+            throw new CoolException("鐩爣搴撲綅涓嶅瓨鍦�");
+        }
+
+        if(targetLoc.getLocStsId() != LocStsType.O.val()){
+            throw new CoolException("鐩爣搴撲綅闈炵┖鐘舵��");
+        }
+
+        TaskType taskType = taskTypeService.getById(11);
+        if (taskType == null) {
+            throw new CoolException("浠诲姟绫诲瀷涓嶅瓨鍦�");
+        }
+
+        Task task = new Task();
+        task.setTaskNo(this.generateTaskNo(taskType.getId()));//浠诲姟鍙�
+        task.setTaskSts(TaskStsType.GENERATE_IN.id);//1.鐢熸垚鍏ュ簱浠诲姟
+        task.setTaskType(taskType.getId());//浠诲姟绫诲瀷
+        task.setIoPri(this.generateIoPri(taskType.getId()));//浼樺厛绾�
+        task.setOriginLoc(param.getSourceLocNo());
+        task.setTargetLoc(param.getTargetLocNo());
+        task.setOriginSite(null);
+        task.setTargetSite(null);
+        task.setBarcode(sourceLoc.getBarcode());//鎵樼洏鐮�
+        boolean taskSave = taskService.save(task);
+        if (!taskSave) {
+            throw new CoolException("浠诲姟鐢熸垚澶辫触");
+        }
+
+        List<LocDetl> locDetls = locDetlService.list(new LambdaQueryWrapper<LocDetl>().eq(LocDetl::getLocId, sourceLoc.getId()));
+        if(locDetls.isEmpty()){
+            throw new CoolException("婧愬簱浣嶆槑缁嗕笉瀛樺湪");
+        }
+
+        //鐢熸垚浠诲姟鏄庣粏
+        for (LocDetl locDetl : locDetls) {
+            TaskDetl taskDetl = new TaskDetl();
+            taskDetl.setTaskId(task.getId());
+            taskDetl.setTaskNo(task.getTaskNo());
+            taskDetl.setAnfme(locDetl.getAnfme());//鏁伴噺
+            taskDetl.setStock(0D);//搴撳瓨
+            taskDetl.setBatch(locDetl.getBatch());//鎵瑰彿
+            taskDetl.setBarcode(sourceLoc.getBarcode());
+            taskDetl.setMatId(locDetl.getMatId());
+            taskDetl.setMatnr(locDetl.getMatnr());
+            boolean taskDetlSave = taskDetlService.save(taskDetl);
+            if(!taskDetlSave){
+                throw new CoolException("浠诲姟鏄庣粏鐢熸垚澶辫触");
+            }
+
+            //鐢熸垚鏄庣粏鎵╁睍
+            List<LocDetlField> locDetlFieldList = locDetlFieldService.list(new LambdaQueryWrapper<LocDetlField>().eq(LocDetlField::getDetlId, locDetl.getId()));
+            for (LocDetlField locDetlField : locDetlFieldList) {
+                TaskDetlField taskDetlField = new TaskDetlField();
+                taskDetlField.setName(locDetlField.getName());
+                taskDetlField.setFieldId(locDetlField.getFieldId());
+                taskDetlField.setDetlId(taskDetl.getId());
+                taskDetlField.setValue(locDetlField.getValue());
+                boolean taskDetlFieldSave = taskDetlFieldService.save(taskDetlField);
+                if(!taskDetlFieldSave){
+                    throw new CoolException("鏄庣粏鎵╁睍鐢熸垚澶辫触");
+                }
+            }
+        }
+
+        //搴撲綅F => R
+        sourceLoc.setLocStsId(LocStsType.R.val());
+        sourceLoc.setUpdateTime(new Date());
+        boolean sourceLocUpdate = locService.updateById(sourceLoc);
+        if(!sourceLocUpdate){
+            throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�");
+        }
+
+        //搴撲綅O => S
+        targetLoc.setLocStsId(LocStsType.S.val());
+        targetLoc.setUpdateTime(new Date());
+        boolean targetLocUpdate = locService.updateById(targetLoc);
+        if(!targetLocUpdate){
+            throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�");
+        }
+
+        return true;
+    }
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskTimer.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskTimer.java
index 1f72b35..7f0389f 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskTimer.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskTimer.java
@@ -74,6 +74,9 @@
                     case 1://鍏ュ簱
                         executeTask1(task);
                         break;
+                    case 11://搴撲綅绉昏浆
+                        executeTask11(task);
+                        break;
                     case 53://鎷f枡鍐嶅叆搴�
                         executeTask53(task);
                         break;
@@ -204,6 +207,88 @@
         }
     }
 
+    //搴撲綅绉昏浆
+    private void executeTask11(Task task) {
+        Long hostId = task.getHostId();
+
+        Loc originLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, task.getOriginLoc()).eq(Loc::getHostId, hostId));
+        if (originLoc == null) {
+            throw new CoolException("婧愬簱浣嶄笉瀛樺湪");
+        }
+
+        if (originLoc.getLocStsId() != LocStsType.R.val()) {
+            throw new CoolException("搴撲綅鐘舵�佷笉澶勪簬R.鍑哄簱棰勭害");
+        }
+
+        Loc targetLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, task.getTargetLoc()).eq(Loc::getHostId, hostId));
+        if (targetLoc == null) {
+            throw new CoolException("鐩爣搴撲綅涓嶅瓨鍦�");
+        }
+
+        if (targetLoc.getLocStsId() != LocStsType.S.val()) {
+            throw new CoolException("搴撲綅鐘舵�佷笉澶勪簬S.鍏ュ簱棰勭害");
+        }
+
+        originLoc.setLocStsId(LocStsType.O.val());
+        originLoc.setUpdateTime(new Date());
+        originLoc.setBarcode("");
+        if (!locService.updateById(originLoc)) {
+            throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�");
+        }
+
+        targetLoc.setLocStsId(LocStsType.F.val());
+        targetLoc.setUpdateTime(new Date());
+        targetLoc.setBarcode(task.getBarcode());
+        if (!locService.updateById(targetLoc)) {
+            throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�");
+        }
+
+        List<TaskDetl> taskDetls = taskDetlService.getTaskDetlByTaskId(task.getId());
+        if (taskDetls.isEmpty()) {
+            throw new CoolException("浠诲姟鏄庣粏涓嶅瓨鍦�");
+        }
+
+        //娣诲姞搴撳瓨鏄庣粏
+        for (TaskDetl taskDetl : taskDetls) {
+            LocDetl locDetl = new LocDetl();
+            locDetl.setLocId(targetLoc.getId());
+            locDetl.setLocNo(targetLoc.getLocNo());
+            locDetl.setMatId(taskDetl.getMatId());
+            locDetl.setMatnr(taskDetl.getMat$().getMatnr());
+            locDetl.setOrderNo(taskDetl.getOrderNo());
+            locDetl.setBatch(taskDetl.getBatch());
+            locDetl.setAnfme(taskDetl.getAnfme());
+            locDetl.setHostId(hostId);
+            if (!locDetlService.save(locDetl)) {
+                throw new CoolException("鎻掑叆搴撳瓨鏄庣粏澶辫触");
+            }
+
+            //娣诲姞搴撳瓨鏄庣粏鎵╁睍瀛楁
+            List<TaskDetlField> detlFields = taskDetlFieldService.list(new LambdaQueryWrapper<TaskDetlField>().eq(TaskDetlField::getDetlId, taskDetl.getId()).eq(TaskDetlField::getHostId, hostId));
+            for (TaskDetlField detlField : detlFields) {
+                LocDetlField locDetlField = new LocDetlField();
+                locDetlField.setDetlId(locDetl.getId());
+                locDetlField.setFieldId(detlField.getFieldId());
+                locDetlField.setName(detlField.getName());
+                locDetlField.setValue(detlField.getValue());
+                locDetlField.setHostId(hostId);
+                if (!locDetlFieldService.save(locDetlField)) {
+                    throw new CoolException("鎻掑叆鏄庣粏鎵╁睍瀛楁澶辫触");
+                }
+            }
+        }
+
+        List<LocDetl> locDetls = locDetlService.list(new LambdaQueryWrapper<LocDetl>().eq(LocDetl::getLocId, originLoc.getId()));
+        for (LocDetl locDetl : locDetls) {
+            boolean remove = locDetlFieldService.remove(new LambdaQueryWrapper<LocDetlField>().eq(LocDetlField::getDetlId, locDetl.getId()));
+            boolean result = locDetlService.removeById(locDetl.getId());
+            if (!result) {
+                throw new CoolException("娓呴櫎鏄庣粏澶辫触");
+            }
+        }
+
+    }
+
     //鎷f枡鍐嶅叆搴�
     private void executeTask53(Task task) {
         Long hostId = task.getHostId();

--
Gitblit v1.9.1