package com.vincent.rsf.server.api.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.vincent.rsf.framework.common.Cools; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.api.controller.params.OtherReceiptParams; import com.vincent.rsf.server.api.controller.params.ReceiptParams; import com.vincent.rsf.server.api.entity.dto.ReceiptDetlsDto; import com.vincent.rsf.server.api.entity.enums.OrderWorkType; import com.vincent.rsf.server.api.service.MobileService; import com.vincent.rsf.server.common.config.ConfigProperties; import com.vincent.rsf.server.common.enums.WarehouseAreaType; import com.vincent.rsf.server.common.security.JwtSubject; import com.vincent.rsf.server.common.utils.JwtUtil; import com.vincent.rsf.server.manager.entity.*; import com.vincent.rsf.server.manager.mapper.*; import com.vincent.rsf.server.manager.service.WarehouseAreasItemService; import com.vincent.rsf.server.manager.service.WarehouseAreasService; import com.vincent.rsf.server.system.constant.CodeRes; import com.vincent.rsf.server.system.controller.param.LoginParam; import com.vincent.rsf.server.system.controller.result.LoginResult; import com.vincent.rsf.server.system.entity.Tenant; import com.vincent.rsf.server.system.entity.User; import com.vincent.rsf.server.system.entity.UserLogin; import com.vincent.rsf.server.system.mapper.TenantMapper; import com.vincent.rsf.server.system.mapper.UserMapper; import com.vincent.rsf.server.system.service.UserLoginService; import com.vincent.rsf.server.system.utils.SerialRuleUtils; import org.apache.tika.utils.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.util.*; /** * @author Ryan * @version 1.0 * @title MobileServiceImpl * @description * @create 2025/3/10 08:07 */ @Service public class MobileServiceImpl implements MobileService { @Value("${super.pwd}") private String superPwd; @Resource private ConfigProperties configProperties; @Autowired private TenantMapper tenantService; @Autowired private UserMapper userService; @Autowired private UserLoginService userLoginService; @Autowired private WarehouseAreasItemService warehouseAreasItemService; @Autowired private WarehouseAreasService warehouseAreasService; @Resource private AsnOrderItemMapper asnOrderItemMapper; @Resource private AsnOrderMapper asnOrderMapper; @Resource private MatnrMapper matnrMapper; @Resource private QlyInspectMapper qlyInspectMapper; @Resource private StockItemMapper stockItemMapper; @Resource private PurchaseItemMapper purchaseItemMapper; /** * @author Ryan * @description 手持PDA登录接口 * @params LoginParam param, HttpServletRequest request * @return * @time 2025/3/10 15:36 */ @Override public R login(LoginParam param, HttpServletRequest request) { User user = userService.selectByUsernameWithoutTenant(param.getUsername(), null); if (param.getUsername().equals("super") && param.getPassword().equals(Cools.md5(superPwd))) { Map res = new HashMap<>(); res.put("username", param.getUsername()); res.put("token", JwtUtil.buildToken(new JwtSubject(param.getUsername(), user.getTenantId()), configProperties.getTokenExpireTime(), configProperties.getTokenKey())); return R.ok(res); } if (Cools.isEmpty(user)) { return R.parse(CodeRes.USER_10001); } if (user.getStatus() != 1) { return R.parse(CodeRes.USER_10002); } if (!user.getPassword().equals(param.getPassword())) { return R.parse(CodeRes.USER_10003); } String accessToken = JwtUtil.buildToken(new JwtSubject(param.getUsername(), user.getTenantId()), configProperties.getTokenExpireTime(), configProperties.getTokenKey()); userLoginService.saveAsync(user.getId(), accessToken, UserLogin.TYPE_LOGIN, user.getTenantId(), null, request); Tenant tenant = tenantService.selectById(user.getTenantId()); return R.ok("Sign In Success").add(new LoginResult(accessToken, user, tenant.getName())); } /** * @author Ryan * @description 扫码获取收货明细 * @param barcode * @return * @time 2025/3/10 15:37 */ @Override public R getOrderByCode(String barcode) { if (StringUtils.isEmpty(barcode)) { return R.error("标签码不能为空!!"); } AsnOrderItem asnOrderItem = asnOrderItemMapper.selectOne(new LambdaQueryWrapper().eq(AsnOrderItem::getBarcode, barcode)); if (Objects.isNull(asnOrderItem)) { throw new CoolException("单据明细不存在!!"); } return getAsnOrderItem(asnOrderItem); } /** * @author Ryan * @description 收货至收货区 * @param params * @return * @time 2025/3/10 15:41 */ @Override @Transactional(rollbackFor = Exception.class) public R receiptToWarehouse(ReceiptParams params) { if (params.getReceipts().isEmpty()) { throw new CoolException("收货明细不能为空!!"); } if (Objects.isNull(params.getWhAreaId())) { throw new CoolException("库区标识不能为空!!"); } WarehouseAreas areasItem = warehouseAreasService.getOne(new LambdaQueryWrapper().eq(WarehouseAreas::getId, params.getWhAreaId())); if (Objects.isNull(areasItem)) { throw new CoolException("数据错误:当前库区不存在!!"); } List receipts = params.getReceipts(); List allOrders = new ArrayList<>(); receipts.forEach(dto -> { Matnr matnr = matnrMapper.selectById(dto.getMatnrId()); if (Objects.isNull(matnr)) { throw new CoolException("数据错误:当前物料不存在!!"); } WarehouseAreasItem item = new WarehouseAreasItem(); item.setBarcode(dto.getBarcode()) .setAreaName(areasItem.getName()) .setAreaId(areasItem.getId()) .setStockUnit(dto.getStockUnit()) .setBatch(SerialRuleUtils.generateRuleCode("sys_receipt_batch", dto)) .setAnfme(dto.getReceiptQty()) .setSplrBtch(dto.getSplrBatch()) .setMatnrCode(matnr.getCode()) .setMatnrId(matnr.getId()) .setMatnrName(matnr.getName()) //库存单位为最小单位 .setUnit(dto.getStockUnit()) .setStockUnit(dto.getStockUnit()) .setWeight(matnr.getWeight()) .setShipperId(matnr.getShipperId()); //TODO 供应商标识未设置,标识由PO单供应商编码转换 allOrders.add(item); }); if (!warehouseAreasItemService.saveBatch(allOrders)) { throw new CoolException("收货失败!!"); } return R.ok("操作成功"); } /** * @author Ryan * @description 其它收货 * @param params * @return */ @Override public R otherReceipt(OtherReceiptParams params) { if (Objects.isNull(params.getAsnCode())) { throw new CoolException("通知单不能为空!!"); } if (Objects.isNull(params.getBarcode())) { throw new CoolException("物料编码不能为空!!"); } AsnOrderItem asnOrderItem = asnOrderItemMapper.selectOne(new LambdaQueryWrapper() .eq(AsnOrderItem::getAsnCode, params.getAsnCode()) .eq(AsnOrderItem::getBarcode, params.getBarcode())); if (Objects.isNull(asnOrderItem)) { throw new CoolException("单据明细不存在!!"); } return getAsnOrderItem(asnOrderItem); } /** * @author Ryan * @description 获取所有通知单 * @return */ @Override public List getAllAsnOrders() { List asnOrders = asnOrderMapper.selectList(new LambdaQueryWrapper().eq(AsnOrder::getWkType, OrderWorkType.ORDER_PURCHASE_IN.type)); return asnOrders; } /** * @author Ryan * @description 获取收货区 * @param * @return * @time 2025/3/11 10:12 */ @Override public R getReceiptAreas() { return R.ok(warehouseAreasService.list(new LambdaQueryWrapper().eq(WarehouseAreas::getType, WarehouseAreaType.WAREHOUSE_AREA_RECEIPT.type))); } /** * 获取ReceiptDetlsDto */ private R getAsnOrderItem(AsnOrderItem asnOrderItem) { ReceiptDetlsDto detlsDto = new ReceiptDetlsDto(); detlsDto.setAsnCode(asnOrderItem.getAsnCode()) .setMatnk(asnOrderItem.getMatnk()) .setBarcode(asnOrderItem.getBarcode()) .setPoCode(asnOrderItem.getPoCode()) .setPurQty(asnOrderItem.getAnfme()) .setSplrBatch(asnOrderItem.getSplrBatch()); Matnr matnr = matnrMapper.selectById(asnOrderItem.getMatnrId()); if (Objects.isNull(matnr)) { throw new CoolException("数据错误:当前物料不存在!!"); } //SET 物料最大存放数量 detlsDto.setMaxQty(matnr.getMaxQty()) .setMatnrId(matnr.getId()) .setStockUnit(matnr.getStockUnit()); QlyInspect inspect = qlyInspectMapper.selectOne(new LambdaQueryWrapper() .eq(QlyInspect::getAsnItemId, asnOrderItem.getId()).eq(QlyInspect::getPoItemId, asnOrderItem.getPoDetlId())); if (!Objects.isNull(inspect)) { //set 质检结果 detlsDto.setInspect(inspect.getStatus$()); } //获取当前库存信息 StockItem stockItem = stockItemMapper.selectOne(new LambdaQueryWrapper() .eq(StockItem::getAsnItemId, asnOrderItem.getId()) .eq(StockItem::getMatnrId, asnOrderItem.getMatnrId())); //SET 当前库存数量 if (Objects.isNull(stockItem)) { detlsDto.setStockQty(0.0); } else { detlsDto.setStockQty(stockItem.getQty() + stockItem.getWorkQty()); } //获取采购单明细信息 PurchaseItem purchaseItem = purchaseItemMapper.selectOne(new LambdaQueryWrapper().eq(PurchaseItem::getId, asnOrderItem.getPoDetlId())); //SET 平台行号 detlsDto.setPlatformId(purchaseItem.getPlatItemId()); return R.ok(detlsDto); } }