skyouc
13 小时以前 ebdfa825c07189b5f8e89f147d96d1bc612589db
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
package com.vincent.rsf.server.manager.service.impl;
 
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.vincent.rsf.framework.common.R;
import com.vincent.rsf.framework.exception.CoolException;
import com.vincent.rsf.server.common.utils.ExcelUtil;
import com.vincent.rsf.server.manager.controller.params.AsnOrderAndItemsParams;
import com.vincent.rsf.server.manager.entity.WkOrder;
import com.vincent.rsf.server.manager.entity.WkOrderItem;
import com.vincent.rsf.server.manager.entity.Matnr;
import com.vincent.rsf.server.manager.entity.excel.CheckOrderTemplate;
import com.vincent.rsf.server.manager.enums.AsnExceStatus;
import com.vincent.rsf.server.manager.enums.CheckExceStatus;
import com.vincent.rsf.server.manager.enums.OrderType;
import com.vincent.rsf.server.manager.enums.OrderWorkType;
import com.vincent.rsf.server.manager.mapper.CheckOrderMapper;
import com.vincent.rsf.server.manager.service.AsnOrderItemService;
import com.vincent.rsf.server.manager.service.CheckOrderItemService;
import com.vincent.rsf.server.manager.service.CheckOrderService;
import com.vincent.rsf.server.manager.service.MatnrService;
import com.vincent.rsf.server.system.constant.SerialRuleCode;
import com.vincent.rsf.server.system.utils.SerialRuleUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
 
import java.util.*;
import java.util.stream.Collectors;
 
@Service("checkOrderService")
public class CheckOrderServiceImpl extends ServiceImpl<CheckOrderMapper, WkOrder> implements CheckOrderService {
 
    @Autowired
    private MatnrService matnrService;
    @Autowired
    private CheckOrderItemService checkOrderItemService;
    @Autowired
    private AsnOrderItemService asnOrderItemService;
 
    /**
     * @author Ryan
     * @date 2025/7/14
     * @description: 盘点单导入
     * @version 1.0
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R excelImport(MultipartFile file, HashMap<String, Object> hashMap, Long loginUserId) {
        ExcelImportResult result = null;
        try {
            result = ExcelImportUtil.importExcelMore(file.getInputStream(), CheckOrderTemplate.class, ExcelUtil.getDefaultImportParams());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        if (result.getList().isEmpty()) {
            throw new CoolException("表格内容不能为空!!");
        }
        List<CheckOrderTemplate> resultList = result.getList();
        Map<String, List<CheckOrderTemplate>> listMap = resultList.stream().collect(Collectors.groupingBy(CheckOrderTemplate::getCode));
        for (String key : listMap.keySet()) {
            CheckOrderTemplate template = listMap.get(key).stream().findFirst().get();
            WkOrder wkOrder = this.getOne(new LambdaQueryWrapper<WkOrder>().eq(WkOrder::getCode, template.getCode()));
            if (!Objects.isNull(wkOrder)) {
                continue;
            }
            WkOrder order = new WkOrder();
            order.setCode(template.getCode())
                    .setMemo(template.getMemo())
                    .setUpdateBy(loginUserId)
                    .setCreateBy(loginUserId)
                    .setType(OrderType.getTypeVal(template.getType()))
                    .setWkType(OrderWorkType.getWorkType(template.getWkType()));
            if (!this.save(order)) {
                throw new CoolException("单据保存失败!!");
            }
            List<WkOrderItem> items = new ArrayList<>();
            for (CheckOrderTemplate orderTemplate : listMap.get(key)) {
                WkOrderItem orderItem = new WkOrderItem();
                Matnr matnr = null;
                if (StringUtils.isNotBlank(orderTemplate.getMatnrCode())) {
                    matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>()
                            .eq(Matnr::getCode, orderTemplate.getMatnrCode()));
                }
                orderItem.setAsnId(order.getId())
                        .setAsnCode(order.getCode())
                        .setSplrBatch(orderTemplate.getSplrBatch())
                        .setAnfme(Double.parseDouble(orderTemplate.getAnfme()))
                        .setSplrName(orderTemplate.getSplrName())
                        .setSplrCode(orderTemplate.getSplrCode())
                        .setMaktx(orderTemplate.getMaktx())
                        .setMatnrCode(orderTemplate.getMatnrCode());
                if (!Objects.isNull(matnr)) {
                    orderItem.setMaktx(matnr.getName()).setMatnrCode(matnr.getCode()).setMatnrId(matnr.getId());
                }
                items.add(orderItem);
                if (!checkOrderItemService.saveBatch(items)) {
                    throw new CoolException("单据明细保存失败!!");
                }
            }
            if (!items.isEmpty()) {
                double purQty = items.stream().mapToDouble(WkOrderItem::getAnfme).sum();
                if (!this.update(new LambdaUpdateWrapper<WkOrder>()
                        .set(WkOrder::getExceStatus, AsnExceStatus.OUT_STOCK_STATUS_TASK_INIT.val)
                        .set(WkOrder::getAnfme, purQty).eq(WkOrder::getId, order.getId()))) {
                    throw new CoolException("单据数量修改失败!!");
                }
            }
        }
 
        return R.ok("操作成功!!");
    }
 
    /**
     * @param
     * @return
     * @author Ryan
     * @description 保存出库主单及明细
     * @time 2025/4/29 13:47
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R saveCheckOrder(AsnOrderAndItemsParams params, Long loginUserId) {
        if (Objects.isNull(params.getOrders())) {
            throw new CoolException("主单信息不能为空");
        }
        WkOrder orders = params.getOrders();
        if (StringUtils.isBlank(orders.getWkType())) {
            throw new CoolException("业务类型不能为空!!");
        }
 
        String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_CHECK_RULE_CODE, orders);
        if (StringUtils.isBlank(ruleCode)) {
            throw new CoolException("编码规则错误:请检查「SYS_CHECK_RULE_CODE」是否设置正确!!");
        }
        orders.setCode(ruleCode)
                .setType(OrderType.ORDER_CHECK.type)
                .setExceStatus(CheckExceStatus.CHECK_ORDER_STATUS_UN_EXCE.val)
                .setUpdateBy(loginUserId)
                .setCreateBy(loginUserId);
        if (!this.save(orders)) {
            throw new CoolException("主单保存失败!!");
        }
        if (params.getItems().isEmpty()) {
            throw new CoolException("盘点单明细不能为空!!");
        }
        params.setOrders(orders);
        try {
            svaeOrUpdateOrderItem(params, loginUserId);
        } catch (Exception e) {
            throw new CoolException(e.getMessage());
        }
        return R.ok();
    }
 
    /**
     * @param
     * @return
     * @author Ryan
     * @description 更新或保存明细
     * @time 2025/4/7 13:28
     */
    @Transactional(rollbackFor = Exception.class)
    public void svaeOrUpdateOrderItem(AsnOrderAndItemsParams params, Long loginUserId) throws Exception {
        WkOrder orders = params.getOrders();
        params.getItems().forEach(item -> {
            item.put("asnId", orders.getId());
            item.put("asnCode", orders.getCode());
            item.put("poCode", orders.getPoCode());
            item.put("createBy", loginUserId);
            item.put("updateBy", loginUserId);
            if (!asnOrderItemService.fieldsSave(item, loginUserId)) {
                throw new CoolException("明细保存失败!!");
            }
        });
        List<WkOrderItem> orderItems = checkOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>()
                .eq(WkOrderItem::getAsnId, params.getOrders().getId()));
        Double sum = orderItems.stream().mapToDouble(WkOrderItem::getAnfme).sum();
        orders.setAnfme(sum);
        if (!this.updateById(orders)) {
            throw new CoolException("计划收货数量修改失败!!");
        }
    }
 
 
}