package com.vincent.rsf.server.manager.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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.common.utils.ExcelUtil; import com.vincent.rsf.server.common.annotation.OperationLog; import com.vincent.rsf.server.common.domain.BaseParam; import com.vincent.rsf.server.common.domain.KeyValVo; import com.vincent.rsf.server.common.domain.PageParam; import com.vincent.rsf.server.manager.controller.params.GenerateTaskParams; import com.vincent.rsf.server.manager.controller.params.WaitPakinParam; import com.vincent.rsf.server.manager.entity.BasStation; import com.vincent.rsf.server.manager.entity.TaskItem; import com.vincent.rsf.server.manager.entity.WaitPakin; import com.vincent.rsf.server.manager.entity.WaitPakinItem; import com.vincent.rsf.server.manager.service.*; import com.vincent.rsf.server.system.controller.BaseController; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.util.*; import java.util.stream.Collectors; @Api(tags = "组拖通知档") @RestController public class WaitPakinController extends BaseController { @Autowired private WaitPakinService waitPakinService; @Autowired private WaitPakinItemService waitPakinItemService; @Autowired private BasStationService basStationService; @Autowired private TaskService taskService; @Autowired private TaskItemService taskItemService; @PreAuthorize("hasAuthority('manager:waitPakin:list')") @PostMapping("/waitPakin/page") public R page(@RequestBody Map map) { BaseParam baseParam = buildParam(map, BaseParam.class); // 单据组托按单号查询:单号在明细表 asn_code,从 map 取出并移除,避免主表无此字段报错 String asnCode = null; if (baseParam.getMap() != null && baseParam.getMap().containsKey("asnCode")) { Object v = baseParam.getMap().get("asnCode"); if (v != null && StringUtils.isNotBlank(v.toString())) { asnCode = v.toString().trim(); } baseParam.getMap().remove("asnCode"); } PageParam pageParam = new PageParam<>(baseParam, WaitPakin.class); com.baomidou.mybatisplus.core.conditions.query.QueryWrapper qw = pageParam.buildWrapper(true); if (StringUtils.isNotBlank(asnCode)) { List pakinIds = waitPakinItemService.list( new LambdaQueryWrapper() .select(WaitPakinItem::getPakinId) .like(WaitPakinItem::getAsnCode, asnCode)) .stream().map(WaitPakinItem::getPakinId).distinct().collect(Collectors.toList()); if (pakinIds.isEmpty()) { qw.and(w -> w.apply("1 = 0")); } else { qw.in("id", pakinIds); } } Page page = waitPakinService.page(pageParam, qw); fillAsnCodes(page.getRecords()); return R.ok().add(page); } @PreAuthorize("hasAuthority('manager:waitPakin:list')") @PostMapping("/waitPakin/list") public R list(@RequestBody Map map) { List list = waitPakinService.list(); fillAsnCodes(list); return R.ok().add(list); } @PreAuthorize("hasAuthority('manager:waitPakin:list')") @PostMapping({"/waitPakin/many/{ids}", "/waitPakins/many/{ids}"}) public R many(@PathVariable Long[] ids) { List list = waitPakinService.listByIds(Arrays.asList(ids)); fillAsnCodes(list); return R.ok().add(list); } @PreAuthorize("hasAuthority('manager:waitPakin:list')") @GetMapping("/waitPakin/{id}") public R get(@PathVariable("id") Long id) { WaitPakin one = waitPakinService.getById(id); if (one != null) { fillAsnCodes(Collections.singletonList(one)); } return R.ok().add(one); } @PreAuthorize("hasAuthority('manager:waitPakin:save')") @OperationLog("Create 组拖档") @PostMapping("/waitPakin/save") public R save(@RequestBody WaitPakin waitPakin) { waitPakin.setCreateBy(getLoginUserId()); waitPakin.setUpdateBy(getLoginUserId()); if (Objects.isNull(waitPakin.getBarcode()) || StringUtils.isBlank(waitPakin.getBarcode())) { return R.error("拖盘码不能为空!!"); } List list = waitPakinService.list(new LambdaQueryWrapper().eq(WaitPakin::getBarcode, waitPakin.getBarcode())); if (!list.isEmpty()) { return R.error("拖盘已组拖!!"); } if (!waitPakinService.save(waitPakin)) { return R.error("Save Fail"); } return R.ok("Save Success").add(waitPakin); } @PreAuthorize("hasAuthority('manager:waitPakin:update')") @OperationLog("Update 组拖档") @PostMapping("/waitPakin/update") public R update(@RequestBody WaitPakin waitPakin) { waitPakin.setUpdateBy(getLoginUserId()); waitPakin.setUpdateTime(new Date()); if (!waitPakinService.updateById(waitPakin)) { return R.error("Update Fail"); } return R.ok("Update Success").add(waitPakin); } @PreAuthorize("hasAuthority('manager:waitPakin:remove')") @OperationLog("Delete 组拖档") @PostMapping("/waitPakin/remove/{ids}") @Transactional(rollbackFor = Exception.class) public R remove(@PathVariable Long[] ids) { if (Arrays.asList(ids).isEmpty()) { return R.error("参数不能为空!!"); } for (Long id : ids) { WaitPakin waitPakin = waitPakinService.getById(id); BasStation isBarcodeSta = basStationService.getOne(new LambdaQueryWrapper() .eq(BasStation::getBarcode, waitPakin.getBarcode()) ,false ); if (!Cools.isEmpty(isBarcodeSta)){ throw new CoolException("该条码已被"+isBarcodeSta.getStationName()+"站绑定"); } } return waitPakinService.removePakin(Arrays.asList(ids)); } @PreAuthorize("hasAuthority('manager:waitPakin:list')") @PostMapping("/waitPakin/query") public R query(@RequestParam(required = false) String condition) { List vos = new ArrayList<>(); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); if (!Cools.isEmpty(condition)) { wrapper.like(WaitPakin::getId, condition); } waitPakinService.page(new Page<>(1, 30), wrapper).getRecords().forEach( item -> vos.add(new KeyValVo(item.getId(), item.getId())) ); return R.ok().add(vos); } @PreAuthorize("hasAuthority('manager:waitPakin:list')") @PostMapping("/waitPakin/export") public void export(@RequestBody Map map, HttpServletResponse response) throws Exception { List list = waitPakinService.list(); fillAsnCodes(list); ExcelUtil.build(ExcelUtil.create(list, WaitPakin.class), response); } @PreAuthorize("hasAuthority('manager:waitPakin:update')") @ApiOperation("生成任务列表") @PostMapping("/waitPakin/merge") public R generateTask(@RequestBody GenerateTaskParams taskParams) { if (Objects.isNull(taskParams)) { throw new CoolException("参数不能为空!!"); } if (Objects.isNull(taskParams.getWaitPakins()) || taskParams.getWaitPakins().isEmpty()) { throw new CoolException("组拖档不能为空!!"); } return taskService.generateTasks(taskParams, getLoginUserId()); } /** * 根据组托明细填充主档的关联入库通知单号(asnCodes),多个单号逗号分隔 */ private void fillAsnCodes(List list) { if (list == null || list.isEmpty()) { return; } List pakinIds = list.stream().map(WaitPakin::getId).collect(Collectors.toList()); List items = waitPakinItemService.list( new LambdaQueryWrapper() .in(WaitPakinItem::getPakinId, pakinIds) .select(WaitPakinItem::getPakinId, WaitPakinItem::getAsnCode)); Map asnCodesByPakinId = pakinIds.stream().collect(Collectors.toMap( pid -> pid, pid -> items.stream() .filter(i -> pid.equals(i.getPakinId()) && i.getAsnCode() != null && !i.getAsnCode().trim().isEmpty()) .map(WaitPakinItem::getAsnCode) .distinct() .collect(Collectors.joining(",")))); for (WaitPakin p : list) { p.setAsnCodes(asnCodesByPakinId.get(p.getId())); } } }