This commit is contained in:
aikai 2024-06-05 22:33:53 +08:00
commit e6292c3ae2
30 changed files with 716 additions and 110 deletions

View File

@ -2,6 +2,7 @@ package cn.iocoder.yudao.framework.excel.core.util;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.converters.longconverter.LongStringConverter;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import org.springframework.web.multipart.MultipartFile;
@ -37,7 +38,9 @@ public class ExcelUtils {
.autoCloseStream(false) // 不要自动关闭交给 Servlet 自己处理
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度自动适配最大 255 宽度
.registerConverter(new LongStringConverter()) // 避免 Long 类型丢失精度
.sheet(sheetName).doWrite(data);
.excelType(ExcelTypeEnum.XLSX)
.sheet(sheetName)
.doWrite(data);
// 设置 header contentType写在最后的原因是避免报错时响应 contentType 已经被修改了
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, StandardCharsets.UTF_8.name()));
@ -45,13 +48,15 @@ public class ExcelUtils {
}
public static <T> void write(HttpServletResponse response, String filename, String sheetName,
Class<T> head, List<T> data, List<String> deptName, List<String> postName) throws IOException {
Class<T> head, List<T> data,
int col, List<String> value,
int col1,List<String> value1) throws IOException {
// 输出excel
EasyExcel.write(response.getOutputStream(), head)
.autoCloseStream(false) // 不要自动关闭交给 Servlet 自己处理
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度自动适配最大 255 宽度
.registerWriteHandler(new SpinnerWriteHandler(deptName, postName))
.registerWriteHandler(new SpinnerWriteHandler(col, value, col1, value1))
.registerConverter(new LongStringConverter()) // 避免 Long 类型丢失精度
.sheet(sheetName).doWrite(data);

View File

@ -16,6 +16,10 @@ import java.util.Map;
public class SpinnerWriteHandler implements SheetWriteHandler {
private int col;
private int col1;
private List<String> deptName;
private List<String> postName;
@ -23,8 +27,11 @@ public class SpinnerWriteHandler implements SheetWriteHandler {
public SpinnerWriteHandler() {
}
public SpinnerWriteHandler(List<String> deptName, List<String> postName) {
public SpinnerWriteHandler(int col, List<String> deptName,
int col1, List<String> postName) {
this.col = col;
this.col1 = col1;
this.deptName = deptName;
this.postName = postName;
}
@ -35,8 +42,8 @@ public class SpinnerWriteHandler implements SheetWriteHandler {
Map<Integer, String[]> mapDropDown = new HashMap<>();
// 这里的key值 对应导出列的顺序 从0开始
mapDropDown.put(1, deptName.toArray(new String[0]));
mapDropDown.put(2, postName.toArray(new String[0]));
mapDropDown.put(col, deptName.toArray(new String[0]));
mapDropDown.put(col1, postName.toArray(new String[0]));
Sheet sheet = writeSheetHolder.getSheet();
/// 开始设置下拉框
DataValidationHelper helper = sheet.getDataValidationHelper();// 设置下拉框

View File

@ -66,6 +66,11 @@ public interface DeptApi {
@Parameter(name = "factoryId", description = "工厂编号", example = "100001", required = true)
CommonResult<DeptRespDTO> getDeptByFactoryId(@RequestParam("factoryId") Long factoryId);
@GetMapping(PREFIX + "/getListByLeader")
@Operation(summary = "获取所有部门信息")
@Parameter(name = "userId", description = "用户编号", example = "146", required = true)
CommonResult<List<DeptRespDTO>> getDeptListByLeader(@RequestParam("userId") Long userId);
/**
* 获得指定编号的部门 Map
*

View File

@ -101,4 +101,11 @@ public class DeptApiImpl implements DeptApi {
DeptDO deptDO = deptService.getDeptByFactoryId(factoryId);
return success(BeanUtils.toBean(deptDO, DeptRespDTO.class));
}
@Override
public CommonResult<List<DeptRespDTO>> getDeptListByLeader(Long userId) {
List<DeptDO> deptDOS = deptService.getDeptByLeaderId(userId);
return success(BeanUtils.toBean(deptDOS, DeptRespDTO.class));
}
}

View File

@ -215,7 +215,9 @@ public class UserController {
// 输出 Excel
ExcelUtils.write(response, "用户数据.xls", "数据", UserRespVO.class,
UserConvert.INSTANCE.convertList(list, deptMap, postMap), getDeptNameFun(deptDO), getPostNameFun(postDO));
UserConvert.INSTANCE.convertList(list, deptMap, postMap),
1, getDeptNameFun(deptDO),
2, getPostNameFun(postDO));
}
@GetMapping("/get-import-template")
@ -237,7 +239,10 @@ public class UserController {
postDO.sort(Comparator.comparing(PostDO::getSort));
// 输出
ExcelUtils.write(response, "用户导入模板.xlsx", "用户列表", UserImportExcelVO.class, null, getDeptNameFun(deptDO), getPostNameFun(postDO));
ExcelUtils.write(response, "用户导入模板.xlsx", "用户列表",
UserImportExcelVO.class, null,
1, getDeptNameFun(deptDO),
2, getPostNameFun(postDO));
}
@PostMapping("/import")

View File

@ -24,4 +24,6 @@ public interface ErrorCodeConstants {
//出入库数据模块
ErrorCode SIZEDATA_NOT_EXISTS = new ErrorCode(1_000_002_001, "不能操作非当天录入得数据");
ErrorCode FACTORY_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_000_002_002, "导入出入库数据不能为空!");
}

View File

@ -1,3 +0,0 @@
// TODO 待办请将下面的错误码复制到 yudao-module-smartfactory-api 模块的 ErrorCodeConstants 类中注意请给TODO 补充编号设置一个错误码编号
// ========== 工厂信息 TODO 补充编号 ==========
ErrorCode FACTORY_INFO_NOT_EXISTS = new ErrorCode(TODO 补充编号, "工厂信息不存在");

View File

@ -3,27 +3,33 @@ package cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataDetailRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataPageReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataTotalVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.*;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeCreateReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeDetailRespVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factoryinfo.FactoryInfoDO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.size.SizeDO;
import cn.iocoder.yudao.module.smartfactory.service.factorydata.FactoryDataService;
import cn.iocoder.yudao.module.smartfactory.service.factorydata.FactoryDataSizeService;
import cn.iocoder.yudao.module.smartfactory.service.factoryinfo.FactoryInfoService;
import cn.iocoder.yudao.module.smartfactory.service.size.SizeService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
@ -40,6 +46,12 @@ public class FactoryDataController {
@Resource
private FactoryDataSizeService factoryDataSizeService;
@Resource
private FactoryInfoService factoryInfoService;
@Resource
private SizeService sizeService;
@PostMapping("/create-size")
@Operation(summary = "创建工厂出库入库规格数据")
@PreAuthorize("@ss.hasPermission('smartfactory:factory-data:create')")
@ -110,8 +122,51 @@ public class FactoryDataController {
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<FactoryDataDetailRespVO> list = dataService.getDataPage(pageReqVO).getList();
List<FactoryDataExportVO> exportVOS = new ArrayList<>();
for (FactoryDataDetailRespVO respVO : list) {
exportVOS.addAll(
respVO.getItems().stream().map(info -> {
FactoryDataExportVO exportVO = BeanUtils.toBean(info, FactoryDataExportVO.class);
exportVO.setFactoryName(respVO.getFactoryName());
exportVO.setDate(respVO.getDate());
exportVO.setInTotalNum(respVO.getInTotalNum());
exportVO.setOutTotalNum(respVO.getOutTotalNum());
exportVO.setDamageTotalNum(respVO.getDamageNum());
return exportVO;
}).collect(Collectors.toList()));
}
// 导出 Excel
ExcelUtils.write(response, "工厂出库入库数据.xls", "数据", FactoryDataDetailRespVO.class,
list);
ExcelUtils.write(response, "工厂出库入库数据.xlsx", "数据", FactoryDataExportVO.class, exportVOS);
}
@GetMapping("/get-import-template")
@Operation(summary = "获得导入模板")
public void importTemplate(HttpServletResponse response) throws IOException {
// 获取工厂信息
List<FactoryInfoDO> factoryInfoDOS = factoryInfoService.getFactoryListByType();
List<String> factory = factoryInfoDOS.stream().map(info -> info.getId() + ":" + info.getShortName()).collect(Collectors.toList());
// 获取规格信息
List<SizeDO> sizeDOS = sizeService.getListSize();
List<String> size = sizeDOS.stream().map(info -> info.getId() + ":" + info.getName()).collect(Collectors.toList());
// 输出
ExcelUtils.write(response, "出入库数据导入模板.xlsx", "详情",
FactoryDataExportVO.class, null,
0, factory,
2, size);
}
@PostMapping("/import")
@Operation(summary = "导入出入库数据")
@Parameter(name = "file", description = "Excel 文件", required = true)
@PreAuthorize("@ss.hasPermission('smartfactory:factory-data:import')")
public CommonResult<FactoryImportRespVO> importExcel(@RequestParam("file") MultipartFile file) throws Exception {
List<FactoryDataImportVO> list = ExcelUtils.read(file, FactoryDataImportVO.class);
return success(dataService.importUserList(list));
}
}

View File

@ -20,6 +20,11 @@ public class FactoryDataDetailRespVO {
@Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-05-14")
private LocalDate date;
/**
* 规格明细
*/
private List<FactoryDataInfoRespVO> items;
@Schema(description = "入库总箱数")
private Integer inTotalNum;
@ -34,9 +39,4 @@ public class FactoryDataDetailRespVO {
@Schema(description = "是否可编辑 | 1可 ")
private Integer isEdit;
/**
* 规格明细
*/
private List<FactoryDataInfoRespVO> items;
}

View File

@ -0,0 +1,51 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
@Schema(description = "出入库数据导出excel VO")
@Data
@ExcelIgnoreUnannotated
public class FactoryDataExportVO {
@ExcelProperty("工厂名称")
private String factoryName;
@ExcelProperty("日期")
private LocalDate date;
@ExcelProperty("规格")
private String sizeName;
@ExcelProperty("入库数")
private Integer inNum;
@ExcelProperty("入库平方数")
private BigDecimal squareNum;
@ExcelProperty("打包破损数")
private Integer damageNum;
@ExcelProperty("入库破损数")
private Integer inDamageNum;
@ExcelProperty("出库数")
private Integer outNum;
@ExcelProperty("出库破损数")
private Integer outDamageNum;
@ExcelProperty("入库总数")
private Integer inTotalNum;
@ExcelProperty("出库总数")
private Integer outTotalNum;
@ExcelProperty("破损总数")
private Integer damageTotalNum;
}

View File

@ -0,0 +1,51 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.time.LocalDate;
/**
* 出入库数据导入 VO
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = false) // 设置 chain = false避免用户导入有问题
public class FactoryDataImportVO {
@ExcelProperty("工厂名称")
private String factoryName;
@ExcelProperty("日期")
private LocalDate date;
@ExcelProperty("规格")
private String sizeName;
@ExcelProperty("手动打包数")
private Integer num;
@ExcelProperty("自动打包数")
private Integer autoNum;
@ExcelProperty("入库数")
private Integer inNum;
@ExcelProperty("打包破损数")
private Integer damageNum;
@ExcelProperty("入库破损数")
private Integer inDamageNum;
@ExcelProperty("出库数")
private Integer outNum;
@ExcelProperty("出库破损数")
private Integer outDamageNum;
}

View File

@ -37,6 +37,9 @@ public class FactoryDataInfoRespVO {
@Schema(description = "自动打包数")
private Integer autoNum;
@Schema(description = "入库数量Id")
private Long inNumId;
@Schema(description = "入库数量")
private Integer inNum;

View File

@ -0,0 +1,23 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
import lombok.Data;
import java.util.List;
import java.util.Map;
@Schema(description = "管理后台 - 出入库数据导入 Response VO")
@Data
@Builder
public class FactoryImportRespVO {
@Schema(description = "创建成功的用户名数组", requiredMode = Schema.RequiredMode.REQUIRED)
private List<String> createUsernames;
@Schema(description = "更新成功的用户名数组", requiredMode = Schema.RequiredMode.REQUIRED)
private List<String> updateUsernames;
@Schema(description = "导入失败的用户集合key 为用户名value 为失败原因", requiredMode = Schema.RequiredMode.REQUIRED)
private Map<String, String> failureUsernames;
}

View File

@ -50,6 +50,12 @@ public class FactoryDataSizeDetailRespVO {
@Schema(description = "自动打包数")
private Integer autoNum;
@Schema(description = "入库数Id")
private Long inNumId;
@Schema(description = "入库数")
private Integer inNum;
@Schema(description = "打包破损数")
private Integer damageNum;
@ -58,6 +64,9 @@ public class FactoryDataSizeDetailRespVO {
@Schema(description = "入库破损数")
private Integer inDamageNum;
@Schema(description = "是否可编辑 | 0否 1是")
private Integer isEnable = 0;
}
@Data

View File

@ -21,6 +21,12 @@ public class FactoryDataSizeSaveReqVO {
@NotNull(message = "规格片数不能为空")
private Integer sizePieces;
@Schema(description = "入库数量Id")
private Long inNumId;
@Schema(description = "入库数量")
private Integer inNum;
@Schema(description = "入库破损数量Id")
private Long inDamageNumId;

View File

@ -79,6 +79,15 @@ public class FactoryInfoController {
return success(BeanUtils.toBean(factoryInfo, FactorySimpleRespVO.class));
}
@GetMapping("/simple-list-authority")
@Operation(summary = "获得工厂列表(权限检验) | 用于前端下拉框")
@PreAuthorize("@ss.hasPermission('smartfactory:factory-info:query')")
public CommonResult<List<FactorySimpleRespVO>> getFactoryListByAuthority() {
List<FactoryInfoDO> factoryInfo = factoryInfoService.getFactoryListByAuthority();
return success(BeanUtils.toBean(factoryInfo, FactorySimpleRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得工厂信息分页")
@PreAuthorize("@ss.hasPermission('smartfactory:factory-info:query')")

View File

@ -20,7 +20,9 @@ import java.util.List;
@Mapper
public interface FactoryDataSizeMapper extends BaseMapperX<FactoryDataSizeDO> {
List<FactoryDataInfoRespVO> selectDetailList(@Param("factoryId") Long factoryId, @Param("date") LocalDate[] date);
List<FactoryDataInfoRespVO> selectDetailList(@Param("factoryId") Long factoryId,
@Param("date") LocalDate[] date,
@Param("dateTime") LocalDateTime[] createTime);
default void deleteByFactoryId(Long factoryId, String date) {

View File

@ -29,11 +29,11 @@ public interface FactoryInfoMapper extends BaseMapperX<FactoryInfoDO> {
.orderByAsc(FactoryInfoDO::getSort));
}
default List<FactoryInfoDO> selectListByType(Long factoryId) {
default List<FactoryInfoDO> selectListByType(List<Long> factoryId) {
return selectList(new LambdaQueryWrapperX<FactoryInfoDO>()
.eq(FactoryInfoDO::getType, 3)
.eqIfPresent(FactoryInfoDO::getId, factoryId));
.inIfPresent(FactoryInfoDO::getId, factoryId));
}
/**

View File

@ -71,6 +71,12 @@ public class FactoryDataJob {
data.setDamageNum(data.getDamageNum() + infos.get(0).getInDamageNum());
}
if (infos.get(0).getInNum() != null) {
// 设置 入库总数数
data.setTotalNum(data.getTotalNum() + infos.get(0).getInNum());
}
// 如果存在出库数时
if (infos.get(0).getOutNum() != null) {

View File

@ -1,9 +1,7 @@
package cn.iocoder.yudao.module.smartfactory.service.factorydata;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataDetailRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataPageReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataTotalVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.*;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeCreateReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeDetailRespVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataDO;
@ -92,4 +90,11 @@ public interface FactoryDataService {
* @return 出入库数据
*/
FactoryDataDO getListByType(Long factoryId, LocalDate date, Integer type);
/**
* 导入出入库数据
* @param list 数据
* @return 结果
*/
FactoryImportRespVO importUserList(List<FactoryDataImportVO> list);
}

View File

@ -1,25 +1,28 @@
package cn.iocoder.yudao.module.smartfactory.service.factorydata;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataDetailRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataInfoRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataPageReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataTotalVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.*;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeCreateReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeDetailRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeSaveReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packagedata.vo.PackageDataCreateReqVO;
import cn.iocoder.yudao.module.smartfactory.convert.packageData.PackageDataConvert;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataDO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataSizeDO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factoryinfo.FactoryInfoDO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.packageInfo.PackageDO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.packagedata.PackageDataDO;
import cn.iocoder.yudao.module.smartfactory.dal.mysql.factorydata.FactoryDataMapper;
import cn.iocoder.yudao.module.smartfactory.dal.mysql.factorydata.FactoryDataSizeMapper;
import cn.iocoder.yudao.module.smartfactory.service.factoryinfo.FactoryInfoService;
import cn.iocoder.yudao.module.smartfactory.service.packageInfo.PackageService;
import cn.iocoder.yudao.module.smartfactory.service.packagedata.PackageDataService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.context.annotation.Lazy;
@ -34,7 +37,9 @@ import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
import static cn.iocoder.yudao.module.smartfactory.enums.ErrorCodeConstants.*;
/**
@ -59,6 +64,12 @@ public class FactoryDataServiceImpl implements FactoryDataService {
@Resource
private PackageDataService packageDataService;
@Resource
private FactoryDataSizeMapper factoryDataSizeMapper;
@Resource
private PackageService packageService;
@Override
public Long createData(List<FactoryDataDO> factoryDataDOS) {
@ -131,13 +142,23 @@ public class FactoryDataServiceImpl implements FactoryDataService {
respVO.setDate(LocalDate.parse(date));
//获得 规则明细数据
List<FactoryDataInfoRespVO> infoRespVOS = dataSizeService.getDetailList(factoryId, new LocalDate[]{LocalDate.parse(date), LocalDate.parse(date)});
List<FactoryDataInfoRespVO> infoRespVOS = dataSizeService.getDetailList(factoryId, new LocalDate[]{LocalDate.parse(date), LocalDate.parse(date)}, null);
respVO.setInItems(
infoRespVOS.stream()
.filter(info -> info.getInNum() != null || info.getInDamageNum() != null)
List<FactoryDataSizeDetailRespVO.InItem> packageInfo = infoRespVOS.stream()
.filter(info -> (info.getInDamageNum() != null && info.getInNum() == null) || info.getNum() != null || info.getAutoNum() != null)
.map(info -> BeanUtil.toBean(info, FactoryDataSizeDetailRespVO.InItem.class))
.collect(Collectors.toList()));
.collect(Collectors.toList());
List<FactoryDataSizeDetailRespVO.InItem> inItems = infoRespVOS.stream()
.filter(info -> info.getInNum() != null)
.map(info -> {
FactoryDataSizeDetailRespVO.InItem inItem = BeanUtil.toBean(info, FactoryDataSizeDetailRespVO.InItem.class);
inItem.setIsEnable(1);
return inItem;
})
.collect(Collectors.toList());
inItems.addAll(packageInfo);
respVO.setInItems(inItems);
respVO.setOutItems(
infoRespVOS.stream()
@ -156,6 +177,9 @@ public class FactoryDataServiceImpl implements FactoryDataService {
IPage<FactoryDataDetailRespVO> page = dataMapper.selectDetailPage(mpPage, pageReqVO);
PageResult<FactoryDataDetailRespVO> dataPage = new PageResult<>(page.getRecords(), page.getTotal());
//获得 入库数打包破损入库破损出库数出库破损的工厂规格数据
List<FactoryDataInfoRespVO> infoDatas = dataSizeService.getDetailList(pageReqVO.getFactoryId(), pageReqVO.getDate(), pageReqVO.getCreateTime());
List<FactoryDataDetailRespVO> respVOS = dataPage.getList();
if (!respVOS.isEmpty()) {
@ -164,15 +188,18 @@ public class FactoryDataServiceImpl implements FactoryDataService {
List<FactoryInfoDO> factoryInfoDOS = factoryInfoService.getFactoryList(factoryIdS);
Map<Long, FactoryInfoDO> factoryMap = convertMap(factoryInfoDOS, FactoryInfoDO::getId);
//获得 入库数打包破损入库破损出库数出库破损的工厂规格数据
List<FactoryDataInfoRespVO> infoDatas = dataSizeService.getDetailList(pageReqVO.getFactoryId(), pageReqVO.getDate());
respVOS.forEach(items -> {
//规格明细数据
List<FactoryDataInfoRespVO> infoList = infoDatas.stream()
.filter(data -> data.getFactoryId().equals(items.getFactoryId()) && data.getDate().equals(items.getDate()))
.collect(Collectors.toList());
infoList.forEach(info -> {
int num = Optional.ofNullable(info.getNum()).orElse(0);
int autoNum = Optional.ofNullable(info.getAutoNum()).orElse(0);
int inNum = Optional.ofNullable(info.getInNum()).orElse(0);
info.setInNum((num + autoNum + inNum) == 0 ? null : (num + autoNum + inNum));
});
items.setItems(infoList);
items.setFactoryName(factoryMap.get(items.getFactoryId()).getName());
@ -180,7 +207,11 @@ public class FactoryDataServiceImpl implements FactoryDataService {
//移除 已处理过的数据
infoDatas.removeAll(infoList);
});
}else {
respVOS = new ArrayList<>();
}
List<FactoryDataDetailRespVO> toDayData = new ArrayList<>();
// 展示当天录入的数据
if (!infoDatas.isEmpty()) {
@ -189,25 +220,40 @@ public class FactoryDataServiceImpl implements FactoryDataService {
.collect(Collectors.groupingBy(FactoryDataInfoRespVO::getFactoryId,
Collectors.groupingBy(FactoryDataInfoRespVO::getDate)));
Map<Long, FactoryInfoDO> factoryMaps = convertMap(factoryInfoService.getFactoryList(groupedByFactoryIdAndDate.keySet())
, FactoryInfoDO::getId);
groupedByFactoryIdAndDate.forEach((factoryId, dateMap) -> {
//按日期倒叙 并遍历
dateMap.entrySet().stream().sorted(Map.Entry.comparingByKey())
.forEach((date) -> {
dateMap.entrySet().stream().sorted(Map.Entry.comparingByKey()).forEach((date) -> {
FactoryDataDetailRespVO dataDetailRespVO = new FactoryDataDetailRespVO();
dataDetailRespVO.setFactoryId(factoryId);
dataDetailRespVO.setFactoryName(factoryMap.get(factoryId).getName());
dataDetailRespVO.setFactoryName(factoryMaps.get(factoryId).getName());
dataDetailRespVO.setDate(date.getKey());
//设置入库总数
dataDetailRespVO.setInTotalNum(date.getValue().stream().filter(info -> info.getInNum() != null).mapToInt(FactoryDataInfoRespVO::getInNum).sum());
int inSum = date.getValue().stream()
.map(info -> {
Integer num = Optional.ofNullable(info.getNum()).orElse(0);
Integer autoNum = Optional.ofNullable(info.getAutoNum()).orElse(0);
Integer inNUm = Optional.ofNullable(info.getInNum()).orElse(0);
return num + autoNum + inNUm;
})
.mapToInt(Integer::intValue).sum();
dataDetailRespVO.setInTotalNum(inSum == 0 ? null : inSum);
//设置入库平方数
dataDetailRespVO.setSquareNum(date.getValue().stream().map(FactoryDataInfoRespVO::getSquareNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
dataDetailRespVO.setSquareNum(date.getValue().stream().map(FactoryDataInfoRespVO::getSquareNum)
.filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
//设置出库总数
dataDetailRespVO.setOutTotalNum(infoDatas.stream().filter(info -> info.getOutNum() != null).mapToInt(FactoryDataInfoRespVO::getOutNum).sum());
int outTotalNum = date.getValue().stream().filter(info -> info.getOutNum() != null)
.mapToInt(FactoryDataInfoRespVO::getOutNum).sum();
dataDetailRespVO.setOutTotalNum(outTotalNum == 0 ? null : outTotalNum);
//设置 出入库破损总数
Integer sum = infoDatas.stream().map(info -> {
int sum = date.getValue().stream().map(info -> {
FactoryDataInfoRespVO respVO = BeanUtils.toBean(info, FactoryDataInfoRespVO.class);
respVO.setInDamageNum(Optional.ofNullable(info.getInDamageNum()).orElse(0));
respVO.setOutDamageNum(Optional.ofNullable(info.getOutDamageNum()).orElse(0));
@ -215,18 +261,25 @@ public class FactoryDataServiceImpl implements FactoryDataService {
}).mapToInt(info -> info.getInDamageNum() + info.getOutDamageNum()).sum();
dataDetailRespVO.setDamageNum(sum == 0 ? null : sum);
date.getValue().forEach(info -> {
int num = Optional.ofNullable(info.getNum()).orElse(0);
int autoNum = Optional.ofNullable(info.getAutoNum()).orElse(0);
int inNum = Optional.ofNullable(info.getInNum()).orElse(0);
info.setInNum((num + autoNum + inNum) == 0 ? null : (num + autoNum + inNum));
});
dataDetailRespVO.setItems(date.getValue());
//设置 可编辑状态
dataDetailRespVO.setIsEdit(1);
respVOS.add(0, dataDetailRespVO);
toDayData.add(dataDetailRespVO);
});
});
respVOS.addAll(0, toDayData);
dataPage.setTotal((long) respVOS.size());
}
}
return dataPage;
return new PageResult<>(respVOS, dataPage.getTotal());
}
@Override
@ -258,4 +311,155 @@ public class FactoryDataServiceImpl implements FactoryDataService {
return dataMapper.selectListByType(factoryId, date, type);
}
@Override
@Transactional(rollbackFor = Exception.class) // 添加事务异常则回滚所有导入
public FactoryImportRespVO importUserList(List<FactoryDataImportVO> list) {
if (CollUtil.isEmpty(list)) {
throw exception(FACTORY_IMPORT_LIST_IS_EMPTY);
}
FactoryImportRespVO respVO = FactoryImportRespVO.builder().createUsernames(new ArrayList<>()).updateUsernames(new ArrayList<>()).failureUsernames(new LinkedHashMap<>()).build();
list.forEach(data -> {
//校验判断是否有不符合的原因
try {
validateFactoryForCreate(data.getFactoryName(), data.getSizeName(), data.getDate());
} catch (ServiceException ex) {
respVO.getFailureUsernames().put(data.getFactoryName(), ex.getMessage());
return;
}
// 获取 工厂ID
Long factoryId = Long.valueOf(data.getFactoryName().split(":")[0]);
// 获取 规格ID
Long sizeId = Long.valueOf(data.getSizeName().split(":")[0]);
// 获取 规格名称
String sizeName = data.getSizeName().split(":")[1];
PackageDO packageDO = packageService.getPackageByFactoryIdAndSize(factoryId, sizeId);
if (data.getNum() != null || data.getAutoNum() != null) {
PackageDataDO packageDataDO = BeanUtils.toBean(packageDO, PackageDataDO.class);
packageDataDO.setPackageDate(data.getDate());
packageDataDO.setPackageId(packageDO.getId());
packageDataDO.setPackageName(packageDO.getName());
packageDataDO.setSizeName(sizeName);
packageDataDO.setNum(data.getNum());
packageDataDO.setAutoNum(data.getAutoNum());
packageDataDO.setDamageNum(data.getDamageNum());
//计算平方数
String[] size = sizeName.split("\\*");
BigDecimal squareNum = BigDecimal.valueOf((double) Integer.parseInt(size[0]) / 1000)
.multiply(BigDecimal.valueOf((double) Integer.parseInt(size[1]) / 1000))
.multiply(BigDecimal.valueOf(packageDataDO.getSizePieces()))
.multiply(BigDecimal.valueOf(Integer.sum(packageDataDO.getNum(), packageDataDO.getAutoNum())));
//设置平方数
packageDataDO.setSquareNum(squareNum);
// 插入打包线数据
packageDataService.create(packageDataDO);
}
List<FactoryDataSizeDO> factoryDataSizeDOs = new ArrayList<>();
if (data.getInDamageNum() != null || data.getInNum() != null || data.getOutNum() != null) {
if (data.getInDamageNum() != null) {
FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO();
//设置规格信息
dataSizeDO.setId(sizeId);
dataSizeDO.setSizeName(sizeName);
dataSizeDO.setSizePieces(packageDO == null ? null : packageDO.getSizePieces());
//设置工厂和日期
dataSizeDO.setFactoryId(factoryId);
dataSizeDO.setDate(data.getDate());
//设置入库破损数
dataSizeDO.setType(1);
dataSizeDO.setNum(data.getInDamageNum());
factoryDataSizeDOs.add(dataSizeDO);
}
if (data.getInNum() != null) {
FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO();
//设置规格信息
dataSizeDO.setId(sizeId);
dataSizeDO.setSizeName(sizeName);
dataSizeDO.setSizePieces(packageDO == null ? null : packageDO.getSizePieces());
//设置工厂和日期
dataSizeDO.setFactoryId(factoryId);
dataSizeDO.setDate(data.getDate());
//设置入库破损数
dataSizeDO.setType(4);
dataSizeDO.setNum(data.getInNum());
factoryDataSizeDOs.add(dataSizeDO);
}
if (data.getOutNum() != null) {
FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO();
//设置规格信息
dataSizeDO.setId(sizeId);
dataSizeDO.setSizeName(sizeName);
//设置工厂和日期
dataSizeDO.setFactoryId(factoryId);
dataSizeDO.setDate(data.getDate());
//设置入库破损数
dataSizeDO.setType(2);
dataSizeDO.setNum(data.getOutNum());
factoryDataSizeDOs.add(dataSizeDO);
}
if (data.getOutDamageNum() != null) {
FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO();
//设置规格信息
dataSizeDO.setId(sizeId);
dataSizeDO.setSizeName(sizeName);
//设置工厂和日期
dataSizeDO.setFactoryId(factoryId);
dataSizeDO.setDate(data.getDate());
//设置入库破损数
dataSizeDO.setType(3);
dataSizeDO.setNum(data.getOutDamageNum());
factoryDataSizeDOs.add(dataSizeDO);
}
factoryDataSizeMapper.insertBatch(factoryDataSizeDOs);
}
respVO.getCreateUsernames().add(data.getFactoryName());
});
return respVO;
}
private void validateFactoryForCreate(String factoryName, String sizeName, LocalDate date) {
if (factoryName == null) {
throw exception(FACTORY_INFO_NOT_EXISTS);
}
if (sizeName == null) {
throw exception(SIZE_NOT_EXISTS);
}
String factoryId = factoryName.split(":")[0];
Long count = factoryDataSizeMapper.selectCountByType(Long.valueOf(factoryId), date, Arrays.asList(1,2,3,4));
List<PackageDataDO> packageDOs = packageDataService.getListByFactoryIdAndDate(Long.valueOf(factoryId), date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
if (count > 0L || !packageDOs.isEmpty()) {
throw exception(PACKAGE_DATA_EXISTS);
}
}
}

View File

@ -42,7 +42,7 @@ public interface FactoryDataSizeService {
* 获得出入库规格数据 列表
* @return 出入库规格数据
*/
List<FactoryDataInfoRespVO> getDetailList(Long factoryId, LocalDate[] date);
List<FactoryDataInfoRespVO> getDetailList(Long factoryId, LocalDate[] date, LocalDateTime[] createTime);
/**
* 获得指定时间段内 出入库规格数据之和

View File

@ -50,7 +50,7 @@ public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{
//校验 当前日期得 入库数据是否已经录入
if (createReqVO.getType() == 2) {
Long count = factoryDataSizeMapper.selectCountByType(createReqVO.getFactoryId(), createReqVO.getDate(), Collections.singletonList(1));
Long count = factoryDataSizeMapper.selectCountByType(createReqVO.getFactoryId(), createReqVO.getDate(), Arrays.asList(1,4));
if (count > 0L) {
throw exception(PACKAGE_DATA_EXISTS);
}
@ -113,6 +113,20 @@ public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{
factoryDataSizeDOs.add(dataSizeDO);
}
if (reqVO.getInNum() != null) {
FactoryDataSizeDO dataSizeDO = BeanUtils.toBean(reqVO, FactoryDataSizeDO.class);
//设置工厂和日期
dataSizeDO.setFactoryId(createReqVO.getFactoryId());
dataSizeDO.setDate(createReqVO.getDate());
//设置入库数
dataSizeDO.setType(4);
dataSizeDO.setNum(reqVO.getInNum());
factoryDataSizeDOs.add(dataSizeDO);
}
}
factoryDataSizeMapper.insertBatch(factoryDataSizeDOs);
@ -150,6 +164,27 @@ public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{
List<FactoryDataSizeDO> factoryDataSizeDOs = new ArrayList<>();
for (FactoryDataSizeSaveReqVO reqVO : updateReqVO.getItems()) {
if (reqVO.getInNum() != null) {
FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO();
//设置入库数
dataSizeDO.setId(reqVO.getInNumId());
dataSizeDO.setNum(reqVO.getInNum());
if (reqVO.getInNumId() == null) {
dataSizeDO.setFactoryId(updateReqVO.getFactoryId());
dataSizeDO.setDate(updateReqVO.getDate());
dataSizeDO.setSizeId(reqVO.getSizeId());
dataSizeDO.setSizeName(reqVO.getSizeName());
dataSizeDO.setType(4);
createSizeDos.add(dataSizeDO);
}else {
factoryDataSizeDOs.add(dataSizeDO);
}
}
if (reqVO.getInDamageNum() != null) {
FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO();
@ -158,8 +193,18 @@ public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{
dataSizeDO.setId(reqVO.getInDamageNumId());
dataSizeDO.setNum(reqVO.getInDamageNum());
if (reqVO.getInDamageNumId() == null) {
dataSizeDO.setFactoryId(updateReqVO.getFactoryId());
dataSizeDO.setDate(updateReqVO.getDate());
dataSizeDO.setSizeId(reqVO.getSizeId());
dataSizeDO.setSizeName(reqVO.getSizeName());
dataSizeDO.setType(1);
createSizeDos.add(dataSizeDO);
}else {
factoryDataSizeDOs.add(dataSizeDO);
}
}
if (reqVO.getOutNum() != null) {
@ -241,9 +286,9 @@ public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{
}
@Override
public List<FactoryDataInfoRespVO> getDetailList(Long factoryId, LocalDate[] date) {
public List<FactoryDataInfoRespVO> getDetailList(Long factoryId, LocalDate[] date, LocalDateTime[] createTime) {
return factoryDataSizeMapper.selectDetailList(factoryId, date);
return factoryDataSizeMapper.selectDetailList(factoryId, date, createTime);
}
@Override

View File

@ -99,4 +99,10 @@ public interface FactoryInfoService {
* @return 返回与给定工厂ID相关联的天气代码类型为String
*/
String getWeatherCodeByFactoryId(Long factoryId, String areaCode);
/**
* 获得类型为工厂的工厂信息列表
* @return 工厂列表
*/
List<FactoryInfoDO> getFactoryListByAuthority();
}

View File

@ -14,6 +14,8 @@ import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factoryinfo.FactoryIn
import cn.iocoder.yudao.module.smartfactory.dal.mysql.factoryinfo.FactoryInfoMapper;
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
import cn.iocoder.yudao.module.system.api.permission.PermissionApi;
import cn.iocoder.yudao.module.system.api.permission.dto.DeptDataPermissionRespDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import org.springframework.stereotype.Service;
@ -24,6 +26,7 @@ import java.util.*;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
import static cn.iocoder.yudao.module.smartfactory.enums.ErrorCodeConstants.FACTORY_INFO_NOT_EXISTS;
import static cn.iocoder.yudao.module.smartfactory.enums.ErrorCodeConstants.FACTOYRY_EXISTS_STAFF;
@ -46,6 +49,9 @@ public class FactoryInfoServiceImpl implements FactoryInfoService {
@Resource
private AdminUserApi userApi;
@Resource
private PermissionApi permissionApi;
@Override
public Long createFactoryInfo(FactoryInfoSaveReqVO createReqVO) {
// 插入
@ -125,9 +131,7 @@ public class FactoryInfoServiceImpl implements FactoryInfoService {
@Override
public List<FactoryInfoDO> getFactoryListByType() {
DeptRespDTO deptRespDTO = deptApi.getDept(userApi.getUser(getLoginUserId()).getCheckedData().getDeptId()).getCheckedData();
return factoryInfoMapper.selectListByType(deptRespDTO.getFactoryId());
return factoryInfoMapper.selectListByType(null);
}
@Override
@ -189,4 +193,27 @@ public class FactoryInfoServiceImpl implements FactoryInfoService {
public String getWeatherCodeByFactoryId(Long factoryId, String areaCode) {
return factoryInfoMapper.getWeatherCodeByFactoryId(factoryId, areaCode);
}
@Override
public List<FactoryInfoDO> getFactoryListByAuthority() {
List<Long> factoryIds = null;
DeptDataPermissionRespDTO deptDataPermission = permissionApi.getDeptDataPermission(getLoginUserId()).getCheckedData();
// 如果当前登录用户数据权限 不是查看全部数据
if (!deptDataPermission.getAll()) {
List<DeptRespDTO> deptRespDTO = deptApi.getDeptListByLeader(getLoginUserId()).getCheckedData();
if (deptRespDTO != null) {
factoryIds = convertList(deptRespDTO, DeptRespDTO::getFactoryId);
}else {
DeptRespDTO respDTO = deptApi.getDept(userApi.getUser(getLoginUserId()).getCheckedData().getDeptId()).getCheckedData();
factoryIds = Collections.singletonList(respDTO.getFactoryId());
}
}
return factoryInfoMapper.selectListByType(factoryIds);
}
}

View File

@ -53,6 +53,14 @@ public interface PackageService {
*/
List<PackageRespVO> getPackageByFactoryId(Long factoryId);
/**
* 获得指定工厂的打包线
* @param factoryId 工厂编号
* @param sizeId 规格编号
* @return 打包线信息
*/
PackageDO getPackageByFactoryIdAndSize(Long factoryId, Long sizeId);
/**
* 获得打包线分页
*

View File

@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.smartfactory.service.packageInfo;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packageInfo.vo.PackagePageReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packageInfo.vo.PackageRespVO;
@ -106,6 +107,14 @@ public class PackageServiceImpl implements PackageService {
return respVOS;
}
@Override
public PackageDO getPackageByFactoryIdAndSize(Long factoryId, Long sizeId) {
return packageMapper.selectOne(new LambdaQueryWrapperX<PackageDO>()
.eq(PackageDO::getFactoryId, factoryId)
.eq(PackageDO::getSizeId, sizeId));
}
@Override
public PageResult<PackageRespVO> getPackagePage(PackagePageReqVO pageReqVO) {

View File

@ -19,6 +19,13 @@ import java.util.List;
*/
public interface PackageDataService {
/**
* 创建打包线数据
*
* @param createReqVO 创建信息
*/
void create(@Valid PackageDataDO createReqVO);
/**
* 创建打包线数据
*

View File

@ -46,6 +46,12 @@ public class PackageDataServiceImpl implements PackageDataService {
@Lazy // 循环依赖避免报错
private FactoryDataService factoryDataService;
@Override
public void create(PackageDataDO createReqVO) {
packageDataMapper.insert(createReqVO);
}
@Override
public Long createPackageData(PackageDataCreateReqVO createReqVO) {

View File

@ -18,22 +18,43 @@
a.size_id AS sizeId,
a.size_name AS sizeName,
a.size_pieces AS sizePieces,
MAX(a.num) AS num,
MAX(a.auto_num) AS autoNum,
MAX(a.num + a.auto_num) AS inNum,
MAX(a.square_num) AS squareNum,
MAX(a.damage_num) AS damageNum,
MAX(CASE WHEN b.type = 1 THEN b.id END) AS inDamageNumId,
MAX(CASE WHEN b.type = 1 THEN b.num END) AS inDamageNum,
MAX(CASE WHEN b.type = 2 THEN b.id END) AS outNumId,
MAX(CASE WHEN b.type = 2 THEN b.num END) AS outNum,
MAX(CASE WHEN b.type = 3 THEN b.id END) AS outDamageNumId,
MAX(CASE WHEN b.type = 3 THEN b.num END) AS outDamageNum
a.num AS num,
a.auto_num AS autoNum,
a.square_num AS squareNum,
a.damage_num AS damageNum,
b.inNumId,
b.inNum,
b.inDamageNumId,
b.inDamageNum,
b.outNumId,
b.outNum,
b.outDamageNumId,
b.outDamageNum
FROM
sf_package_data AS a
LEFT JOIN
sf_factory_data_size AS b
ON a.factory_id = b.factory_id and a.package_date = b.date and a.size_id = b.size_id
sf_package_data a
LEFT JOIN (
SELECT
factory_id,
date,
size_pieces,
MAX( CASE WHEN type = 4 THEN id END ) AS inNumId,
MAX( CASE WHEN type = 4 THEN num END ) AS inNum,
MAX( CASE WHEN type = 1 THEN id END ) AS inDamageNumId,
MAX( CASE WHEN type = 1 THEN num END ) AS inDamageNum,
MAX( CASE WHEN type = 2 THEN id END ) AS outNumId,
MAX( CASE WHEN type = 2 THEN num END ) AS outNum,
MAX( CASE WHEN type = 3 THEN id END ) AS outDamageNumId,
MAX( CASE WHEN type = 3 THEN num END ) AS outDamageNum
FROM
sf_factory_data_size
GROUP BY
factory_id,
date,
size_pieces
) b
ON a.factory_id = b.factory_id
AND a.package_date = b.date
and a.size_pieces = b.size_pieces
<where>
a.deleted = 0
<if test="factoryId != null">
@ -47,6 +68,14 @@
AND a.package_date &lt;= #{date[1]}
</if>
</if>
<if test="dateTime != null and dateTime.length > 0">
<if test="dateTime[0] != null">
AND a.create_time &gt;= #{dateTime[0]}
</if>
<if test="dateTime[1] != null">
AND a.create_time &lt;= #{dateTime[1]}
</if>
</if>
</where>
GROUP BY a.id,a.factory_id,a.package_name,a.package_date,a.size_id,a.size_name,a.size_pieces
@ -62,9 +91,10 @@
NULL AS sizePieces,
NULL AS num,
NULL AS autoNum,
NULL AS inNum,
NULL AS squareNum,
NULL AS damageNum,
MAX(CASE WHEN c.type = 4 THEN c.id END) AS inNumId,
MAX(CASE WHEN c.type = 4 THEN c.num END) AS inNum,
MAX(CASE WHEN c.type = 1 THEN c.id END) AS inDamageNumId,
MAX(CASE WHEN c.type = 1 THEN c.num END) AS inDamageNum,
MAX(CASE WHEN c.type = 2 THEN c.id END) AS outNumId,
@ -74,7 +104,14 @@
FROM
sf_factory_data_size AS c
WHERE
NOT EXISTS (SELECT 1 FROM sf_package_data WHERE size_id = c.size_id and package_date = c.date)
NOT EXISTS (
SELECT 1
FROM sf_package_data
WHERE
size_id = c.size_id
AND size_pieces != c.size_pieces
AND package_date = c.date
)
AND c.deleted = 0
<if test="factoryId != null">
AND c.factory_id = #{factoryId}
@ -87,6 +124,14 @@
AND c.date &lt;= #{date[1]}
</if>
</if>
<if test="dateTime != null and dateTime.length > 0">
<if test="dateTime[0] != null">
AND c.create_time &gt;= #{dateTime[0]}
</if>
<if test="dateTime[1] != null">
AND c.create_time &lt;= #{dateTime[1]}
</if>
</if>
GROUP BY c.factory_id,c.date,c.size_id,c.size_name
</select>
@ -94,6 +139,7 @@
SELECT
factory_id AS factoryId,
date AS date,
SUM( CASE WHEN type = 4 THEN num END ) AS inNum,
SUM( CASE WHEN type = 1 THEN num END ) AS inDamageNum,
SUM( CASE WHEN type = 2 THEN num END ) AS outNum,
SUM( CASE WHEN type = 3 THEN num END ) AS outDamageNum