库区,仓储,工艺页面

This commit is contained in:
z 2026-05-07 17:41:58 +08:00
parent 1eb9857142
commit 1e5fe980b4
42 changed files with 1809 additions and 662 deletions

View File

@ -47,5 +47,6 @@ public class CheckItemPageReqVO extends PageParam {
@Schema(description = "打印是否取平均值") @Schema(description = "打印是否取平均值")
private String printAvgValues; private String printAvgValues;
@Schema(description = "编号")
private String itemNo;
} }

View File

@ -79,4 +79,12 @@ public class ProcController {
return success(procService.getProcDropdown(keyWord)); return success(procService.getProcDropdown(keyWord));
} }
// 下拉框
@GetMapping("/getProcList")
@Operation(summary = "获得工序不分页")
@PreAuthorize("@ss.hasPermission('biz:proc:query')")
public CommonResult<List<ProcRespVO>> getProcList() {
return success(procService.getProcList());
}
} }

View File

@ -38,5 +38,7 @@ public class ProcRespVO {
@Schema(description = "备注", example = "你猜") @Schema(description = "备注", example = "你猜")
@ExcelProperty("备注") @ExcelProperty("备注")
private String remark; private String remark;
private String creatorName;
} }

View File

@ -0,0 +1,95 @@
package com.ningxia.yunxi.chemmes.module.biz.controller.admin.storearea;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import com.ningxia.yunxi.chemmes.framework.common.pojo.PageParam;
import com.ningxia.yunxi.chemmes.framework.common.pojo.PageResult;
import com.ningxia.yunxi.chemmes.framework.common.pojo.CommonResult;
import com.ningxia.yunxi.chemmes.framework.common.util.object.BeanUtils;
import static com.ningxia.yunxi.chemmes.framework.common.pojo.CommonResult.success;
import com.ningxia.yunxi.chemmes.framework.excel.core.util.ExcelUtils;
import com.ningxia.yunxi.chemmes.framework.operatelog.core.annotations.OperateLog;
import static com.ningxia.yunxi.chemmes.framework.operatelog.core.enums.OperateTypeEnum.*;
import com.ningxia.yunxi.chemmes.module.biz.controller.admin.storearea.vo.*;
import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.storearea.StoreAreaDO;
import com.ningxia.yunxi.chemmes.module.biz.service.storearea.StoreAreaService;
@Tag(name = "管理后台 - 库区主数据")
@RestController
@RequestMapping("/biz/store-area")
@Validated
public class StoreAreaController {
@Resource
private StoreAreaService storeAreaService;
@PostMapping("/create")
@Operation(summary = "创建库区主数据")
@PreAuthorize("@ss.hasPermission('biz:store-area:create')")
public CommonResult<Integer> createStoreArea(@Valid @RequestBody StoreAreaSaveReqVO createReqVO) {
return success(storeAreaService.createStoreArea(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新库区主数据")
@PreAuthorize("@ss.hasPermission('biz:store-area:update')")
public CommonResult<Boolean> updateStoreArea(@Valid @RequestBody StoreAreaSaveReqVO updateReqVO) {
storeAreaService.updateStoreArea(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除库区主数据")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('biz:store-area:delete')")
public CommonResult<Boolean> deleteStoreArea(@RequestParam("id") Integer id) {
storeAreaService.deleteStoreArea(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得库区主数据")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('biz:store-area:query')")
public CommonResult<StoreAreaRespVO> getStoreArea(@RequestParam("id") Integer id) {
StoreAreaDO storeArea = storeAreaService.getStoreArea(id);
return success(BeanUtils.toBean(storeArea, StoreAreaRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得库区主数据分页")
@PreAuthorize("@ss.hasPermission('biz:store-area:query')")
public CommonResult<PageResult<StoreAreaRespVO>> getStoreAreaPage(@Valid StoreAreaPageReqVO pageReqVO) {
PageResult<StoreAreaDO> pageResult = storeAreaService.getStoreAreaPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, StoreAreaRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出库区主数据 Excel")
@PreAuthorize("@ss.hasPermission('biz:store-area:export')")
@OperateLog(type = EXPORT)
public void exportStoreAreaExcel(@Valid StoreAreaPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<StoreAreaDO> list = storeAreaService.getStoreAreaPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "库区主数据.xls", "数据", StoreAreaRespVO.class,
BeanUtils.toBean(list, StoreAreaRespVO.class));
}
}

View File

@ -0,0 +1,45 @@
package com.ningxia.yunxi.chemmes.module.biz.controller.admin.storearea.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import com.ningxia.yunxi.chemmes.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.ningxia.yunxi.chemmes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 库区主数据分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class StoreAreaPageReqVO extends PageParam {
@Schema(description = "创建人", example = "32562")
private String fCreatorUserId;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
@Schema(description = "库区编码")
private String storeAreCd;
@Schema(description = "库区名称", example = "芋艿")
private String storeAreaName;
@Schema(description = "状态(1启用 2 未启用)", example = "1")
private Integer enabledStatus;
@Schema(description = "备注", example = "你说的对")
private String remark;
@Schema(description = "仓库id", example = "23515")
private Integer storeHouseId;
@Schema(description = "仓库类型(1 原料库 2 在制品库 3 成品库)", example = "1")
private String storeType;
@Schema(description = "仓库名称")
private String storeHouseName;
}

View File

@ -0,0 +1,57 @@
package com.ningxia.yunxi.chemmes.module.biz.controller.admin.storearea.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
import com.ningxia.yunxi.chemmes.framework.excel.core.annotations.DictFormat;
import com.ningxia.yunxi.chemmes.framework.excel.core.convert.DictConvert;
@Schema(description = "管理后台 - 库区主数据 Response VO")
@Data
@ExcelIgnoreUnannotated
public class StoreAreaRespVO {
@Schema(description = "自增字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "5665")
@ExcelProperty("自增字段")
private Integer id;
@Schema(description = "创建人", example = "32562")
@ExcelProperty("创建人")
private String fCreatorUserId;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "库区编码")
@ExcelProperty("库区编码")
private String storeAreCd;
@Schema(description = "库区名称", example = "芋艿")
@ExcelProperty("库区名称")
private String storeAreaName;
@Schema(description = "状态(1启用 2 未启用)", example = "1")
@ExcelProperty(value = "状态(1启用 2 未启用)", converter = DictConvert.class)
@DictFormat("system_status") // TODO 代码优化建议设置到对应的 DictTypeConstants 枚举类中
private Integer enabledStatus;
@Schema(description = "备注", example = "你说的对")
@ExcelProperty("备注")
private String remark;
@Schema(description = "仓库id", example = "23515")
@ExcelProperty("仓库id")
private Integer storeHouseId;
@Schema(description = "仓库类型(1 原料库 2 在制品库 3 成品库)", example = "1")
@ExcelProperty("仓库类型(1 原料库 2 在制品库 3 成品库)")
private String storeType;
private String storeHouseName;
}

View File

@ -0,0 +1,37 @@
package com.ningxia.yunxi.chemmes.module.biz.controller.admin.storearea.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
import java.util.*;
@Schema(description = "管理后台 - 库区主数据新增/修改 Request VO")
@Data
public class StoreAreaSaveReqVO {
@Schema(description = "自增字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "5665")
private Integer id;
@Schema(description = "创建人", example = "32562")
private String fCreatorUserId;
@Schema(description = "库区编码")
private String storeAreCd;
@Schema(description = "库区名称", example = "芋艿")
private String storeAreaName;
@Schema(description = "状态(1启用 2 未启用)", example = "1")
private Integer enabledStatus;
@Schema(description = "备注", example = "你说的对")
private String remark;
@Schema(description = "仓库id", example = "23515")
private Integer storeHouseId;
@Schema(description = "仓库类型(1 原料库 2 在制品库 3 成品库)", example = "1")
private String storeType;
}

View File

@ -91,5 +91,14 @@ public class StoreHouseController {
ExcelUtils.write(response, "仓储主数据.xls", "数据", StoreHouseRespVO.class, ExcelUtils.write(response, "仓储主数据.xls", "数据", StoreHouseRespVO.class,
BeanUtils.toBean(list, StoreHouseRespVO.class)); BeanUtils.toBean(list, StoreHouseRespVO.class));
} }
@GetMapping("/get-store-house-select")
@Operation(summary = "获得仓储下拉框数据")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('biz:store-house:query')")
public CommonResult<List<StoreHouseRespVO>> getStoreHouseSelect() {
List<StoreHouseDO> list = storeHouseService.getStoreHouseSelect();
return success(BeanUtils.toBean(list, StoreHouseRespVO.class));
}
} }

View File

@ -21,4 +21,7 @@ public class StoreHousePageReqVO extends PageParam {
@Schema(description = "状态(1启用 2 未启用)", example = "1") @Schema(description = "状态(1启用 2 未启用)", example = "1")
private Integer enabledStatus; private Integer enabledStatus;
private String storeType;
} }

View File

@ -35,5 +35,7 @@ public class TechProcRespVO {
@Schema(description = "备注", example = "你猜") @Schema(description = "备注", example = "你猜")
@ExcelProperty("备注") @ExcelProperty("备注")
private String remark; private String remark;
private String nickname;
} }

View File

@ -1,5 +1,6 @@
package com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.checkitem; package com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.checkitem;
import com.ningxia.yunxi.chemmes.framework.mybatis.core.dataobject.BaseDOWithoutLogic;
import lombok.*; import lombok.*;
import java.util.*; import java.util.*;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -20,7 +21,7 @@ import com.ningxia.yunxi.chemmes.framework.mybatis.core.dataobject.BaseDO;
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class CheckItemDO extends BaseDO { public class CheckItemDO extends BaseDOWithoutLogic {
/** /**
* 自增字段 * 自增字段

View File

@ -1,5 +1,6 @@
package com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.proc; package com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.proc;
import com.ningxia.yunxi.chemmes.module.biz.controller.admin.proc.vo.ProcRespVO;
import lombok.*; import lombok.*;
import java.util.*; import java.util.*;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -45,5 +46,7 @@ public class ProcDO extends BaseDO {
* 备注 * 备注
*/ */
private String remark; private String remark;
@TableField(exist = false)
private String creatorName;
} }

View File

@ -0,0 +1,59 @@
package com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.storearea;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.ningxia.yunxi.chemmes.framework.mybatis.core.dataobject.BaseDO;
/**
* 库区主数据 DO
*
* @author 管理员
*/
@TableName("tba_store_area")
@KeySequence("tba_store_area_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class StoreAreaDO extends BaseDO {
/**
* 自增字段
*/
@TableId
private Integer id;
/**
* 库区编码
*/
private String storeAreCd;
/**
* 库区名称
*/
private String storeAreaName;
/**
* 状态(1启用 2 未启用)
*
* 枚举 {@link TODO system_status 对应的类}
*/
private Integer enabledStatus;
/**
* 备注
*/
private String remark;
/**
* 仓库id
*/
private Integer storeHouseId;
/**
* 仓库类型(1 原料库 2 在制品库 3 成品库)
*/
private String storeType;
@TableField(exist = false)
private String storeHouseName;
}

View File

@ -41,5 +41,7 @@ public class TechProcDO extends BaseDO {
* 备注 * 备注
*/ */
private String remark; private String remark;
@TableField(exist = false)
private String nickname;
} }

View File

@ -17,9 +17,25 @@ import com.ningxia.yunxi.chemmes.module.biz.controller.admin.checkitem.vo.*;
@Mapper @Mapper
public interface CheckItemMapper extends BaseMapperX<CheckItemDO> { public interface CheckItemMapper extends BaseMapperX<CheckItemDO> {
/**
* 根据检验项类型和名称统计数量用于重复校验
*
* @param itemType 适用类型
* @param itemName 检验项名称
* @param excludeId 排除的ID更新时使用
* @return 符合条件的记录数
*/
default Long selectCountByItemTypeAndItemName(String itemType, String itemName, Integer excludeId) {
return selectCount(new LambdaQueryWrapperX<CheckItemDO>()
.eq(CheckItemDO::getItemType, itemType)
.eq(CheckItemDO::getItemName, itemName)
.ne(excludeId != null, CheckItemDO::getId, excludeId));
}
default PageResult<CheckItemDO> selectPage(CheckItemPageReqVO reqVO) { default PageResult<CheckItemDO> selectPage(CheckItemPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<CheckItemDO>() return selectPage(reqVO, new LambdaQueryWrapperX<CheckItemDO>()
.likeIfPresent(CheckItemDO::getItemName, reqVO.getItemName()) .likeIfPresent(CheckItemDO::getItemName, reqVO.getItemName())
.likeIfPresent(CheckItemDO::getItemNo,reqVO.getItemNo())
.eqIfPresent(CheckItemDO::getNature, reqVO.getNature()) .eqIfPresent(CheckItemDO::getNature, reqVO.getNature())
.likeIfPresent(CheckItemDO::getUnitName, reqVO.getUnitName()) .likeIfPresent(CheckItemDO::getUnitName, reqVO.getUnitName())
.eqIfPresent(CheckItemDO::getCheckMethod, reqVO.getCheckMethod()) .eqIfPresent(CheckItemDO::getCheckMethod, reqVO.getCheckMethod())
@ -31,7 +47,7 @@ public interface CheckItemMapper extends BaseMapperX<CheckItemDO> {
.eqIfPresent(CheckItemDO::getTestNum, reqVO.getTestNum()) .eqIfPresent(CheckItemDO::getTestNum, reqVO.getTestNum())
.eqIfPresent(CheckItemDO::getFloatNum, reqVO.getFloatNum()) .eqIfPresent(CheckItemDO::getFloatNum, reqVO.getFloatNum())
.eqIfPresent(CheckItemDO::getPrintAvgValues, reqVO.getPrintAvgValues()) .eqIfPresent(CheckItemDO::getPrintAvgValues, reqVO.getPrintAvgValues())
.orderByDesc(CheckItemDO::getId)); .orderByDesc(CheckItemDO::getCreateTime));
} }
} }

View File

@ -33,4 +33,9 @@ public interface InspPlanItemMapper extends BaseMapperX<InspPlanItemDO> {
.orderByDesc(InspPlanItemDO::getId)); .orderByDesc(InspPlanItemDO::getId));
} }
default Long selectByItemIdCount(Integer id){
return selectCount(new LambdaQueryWrapperX<InspPlanItemDO>()
.eq(InspPlanItemDO::getItemId, id));
}
} }

View File

@ -1,10 +1,13 @@
package com.ningxia.yunxi.chemmes.module.biz.dal.mysql.proc; package com.ningxia.yunxi.chemmes.module.biz.dal.mysql.proc;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.ningxia.yunxi.chemmes.framework.common.pojo.PageResult; import com.ningxia.yunxi.chemmes.framework.common.pojo.PageResult;
import com.ningxia.yunxi.chemmes.framework.mybatis.core.mapper.BaseMapperX; import com.ningxia.yunxi.chemmes.framework.mybatis.core.mapper.BaseMapperX;
import com.ningxia.yunxi.chemmes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.ningxia.yunxi.chemmes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.ningxia.yunxi.chemmes.module.biz.controller.admin.proc.vo.ProcPageReqVO; import com.ningxia.yunxi.chemmes.module.biz.controller.admin.proc.vo.ProcPageReqVO;
import com.ningxia.yunxi.chemmes.module.biz.controller.admin.proc.vo.ProcRespVO;
import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.proc.ProcDO; import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.proc.ProcDO;
import com.ningxia.yunxi.chemmes.module.system.dal.dataobject.user.AdminUserDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.util.List; import java.util.List;
@ -35,4 +38,15 @@ public interface ProcMapper extends BaseMapperX<ProcDO> {
default ProcDO selectByProcCd(String procCd) { default ProcDO selectByProcCd(String procCd) {
return selectOne(ProcDO::getProcCd, procCd); return selectOne(ProcDO::getProcCd, procCd);
}} }
default List<ProcDO> getProcList(){
MPJLambdaWrapper<ProcDO> query = new MPJLambdaWrapper<>();
query.selectAll(ProcDO.class)
.select("u.nickname as creatorName")
.leftJoin(AdminUserDO.class,"u",AdminUserDO::getId,ProcDO::getCreator)
.eq(ProcDO::getEnabledStatus, 0)
.orderByAsc(ProcDO::getProcCd);
return selectList(query);
}
}

View File

@ -0,0 +1,39 @@
package com.ningxia.yunxi.chemmes.module.biz.dal.mysql.storearea;
import java.util.*;
import cn.hutool.core.util.ObjectUtil;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.ningxia.yunxi.chemmes.framework.common.pojo.PageResult;
import com.ningxia.yunxi.chemmes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.ningxia.yunxi.chemmes.framework.mybatis.core.mapper.BaseMapperX;
import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.storearea.StoreAreaDO;
import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.storehouse.StoreHouseDO;
import org.apache.ibatis.annotations.Mapper;
import com.ningxia.yunxi.chemmes.module.biz.controller.admin.storearea.vo.*;
/**
* 库区主数据 Mapper
*
* @author 管理员
*/
@Mapper
public interface StoreAreaMapper extends BaseMapperX<StoreAreaDO> {
default PageResult<StoreAreaDO> selectPage(StoreAreaPageReqVO reqVO) {
MPJLambdaWrapper<StoreAreaDO> query = new MPJLambdaWrapper<>();
query.selectAll(StoreAreaDO.class)
.select("s.store_house_name as storeHouseName")
.leftJoin(StoreHouseDO.class, "s",StoreHouseDO::getId,StoreAreaDO::getStoreHouseId)
.disableSubLogicDel();
query.eq(ObjectUtil.isNotEmpty( reqVO.getStoreType()),StoreAreaDO::getStoreType, reqVO.getStoreType());
query.like(ObjectUtil.isNotEmpty( reqVO.getStoreHouseName()),StoreHouseDO::getStoreHouseName, reqVO.getStoreHouseName());
query.eq(ObjectUtil.isNotEmpty( reqVO.getEnabledStatus()),StoreAreaDO::getEnabledStatus, reqVO.getEnabledStatus());
return selectPage(reqVO, query);
}
default Long selectByStoreAreCodeCount(String storeAreCd, Integer id){
return selectCount(new LambdaQueryWrapperX<StoreAreaDO>()
.eq(StoreAreaDO::getStoreAreCd, storeAreCd).ne(ObjectUtil.isNotEmpty(id),StoreAreaDO::getId,id));
}
}

View File

@ -2,6 +2,7 @@ package com.ningxia.yunxi.chemmes.module.biz.dal.mysql.storehouse;
import java.util.*; import java.util.*;
import cn.hutool.core.util.ObjectUtil;
import com.ningxia.yunxi.chemmes.framework.common.pojo.PageResult; import com.ningxia.yunxi.chemmes.framework.common.pojo.PageResult;
import com.ningxia.yunxi.chemmes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.ningxia.yunxi.chemmes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.ningxia.yunxi.chemmes.framework.mybatis.core.mapper.BaseMapperX; import com.ningxia.yunxi.chemmes.framework.mybatis.core.mapper.BaseMapperX;
@ -21,7 +22,17 @@ public interface StoreHouseMapper extends BaseMapperX<StoreHouseDO> {
return selectPage(reqVO, new LambdaQueryWrapperX<StoreHouseDO>() return selectPage(reqVO, new LambdaQueryWrapperX<StoreHouseDO>()
.likeIfPresent(StoreHouseDO::getStoreHouseName, reqVO.getStoreHouseName()) .likeIfPresent(StoreHouseDO::getStoreHouseName, reqVO.getStoreHouseName())
.eqIfPresent(StoreHouseDO::getEnabledStatus, reqVO.getEnabledStatus()) .eqIfPresent(StoreHouseDO::getEnabledStatus, reqVO.getEnabledStatus())
.eqIfPresent(StoreHouseDO::getStoreType, reqVO.getStoreType())
.orderByDesc(StoreHouseDO::getId)); .orderByDesc(StoreHouseDO::getId));
} }
default Long selectByStoreHouseCodeCount(String storeHouseCd,Integer id){
return selectCount(new LambdaQueryWrapperX<StoreHouseDO>()
.eq(StoreHouseDO::getStoreHouseCd, storeHouseCd).ne(ObjectUtil.isNotEmpty(id),StoreHouseDO::getId,id));
}
default List<StoreHouseDO> getStoreHouseSelect(){
return selectList(new LambdaQueryWrapperX<StoreHouseDO>()
.eq(StoreHouseDO::getEnabledStatus, 0));
}
} }

View File

@ -1,11 +1,14 @@
package com.ningxia.yunxi.chemmes.module.biz.dal.mysql.techproc; package com.ningxia.yunxi.chemmes.module.biz.dal.mysql.techproc;
import java.util.*;
import cn.hutool.core.util.ObjectUtil;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.ningxia.yunxi.chemmes.framework.common.pojo.PageResult; import com.ningxia.yunxi.chemmes.framework.common.pojo.PageResult;
import com.ningxia.yunxi.chemmes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.ningxia.yunxi.chemmes.framework.mybatis.core.mapper.BaseMapperX; import com.ningxia.yunxi.chemmes.framework.mybatis.core.mapper.BaseMapperX;
import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.storearea.StoreAreaDO;
import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.techproc.TechProcDO; import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.techproc.TechProcDO;
import com.ningxia.yunxi.chemmes.module.system.dal.dataobject.user.AdminUserDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import com.ningxia.yunxi.chemmes.module.biz.controller.admin.techproc.vo.*; import com.ningxia.yunxi.chemmes.module.biz.controller.admin.techproc.vo.*;
@ -18,9 +21,21 @@ import com.ningxia.yunxi.chemmes.module.biz.controller.admin.techproc.vo.*;
public interface TechProcMapper extends BaseMapperX<TechProcDO> { public interface TechProcMapper extends BaseMapperX<TechProcDO> {
default PageResult<TechProcDO> selectPage(TechProcPageReqVO reqVO) { default PageResult<TechProcDO> selectPage(TechProcPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<TechProcDO>() MPJLambdaWrapper<TechProcDO> query = new MPJLambdaWrapper<>();
.eqIfPresent(TechProcDO::getEnabledStatus, reqVO.getEnabledStatus()) query.selectAll(TechProcDO.class)
.orderByDesc(TechProcDO::getId)); .select("u.nickname as nickname")
.leftJoin(AdminUserDO.class, "u",AdminUserDO::getId,TechProcDO::getCreator)
.disableSubLogicDel();
query.eq(ObjectUtil.isNotEmpty( reqVO.getEnabledStatus()),TechProcDO::getEnabledStatus, reqVO.getEnabledStatus());
return selectPage(reqVO, query);
} }
default Long selectByTechProcCount(String techProc, Integer id){
return selectCount(new MPJLambdaWrapper<TechProcDO>()
.eq(TechProcDO::getTechProc, techProc)
.eq(TechProcDO::getId, id)
);
}
} }

View File

@ -6,11 +6,16 @@ import com.ningxia.yunxi.chemmes.module.biz.controller.admin.checkitem.vo.CheckI
import com.ningxia.yunxi.chemmes.module.biz.controller.admin.checkitem.vo.CheckItemSaveReqVO; import com.ningxia.yunxi.chemmes.module.biz.controller.admin.checkitem.vo.CheckItemSaveReqVO;
import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.checkitem.CheckItemDO; import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.checkitem.CheckItemDO;
import com.ningxia.yunxi.chemmes.module.biz.dal.mysql.checkitem.CheckItemMapper; import com.ningxia.yunxi.chemmes.module.biz.dal.mysql.checkitem.CheckItemMapper;
import com.ningxia.yunxi.chemmes.module.biz.dal.mysql.inspplanitem.InspPlanItemMapper;
import com.ningxia.yunxi.chemmes.module.system.dal.dataobject.dict.DictDataDO;
import com.ningxia.yunxi.chemmes.module.system.dal.mysql.dict.DictDataMapper;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
import static com.ningxia.yunxi.chemmes.framework.common.exception.util.ServiceExceptionUtil.exception;
/** /**
* 检验项目 Service 实现类 * 检验项目 Service 实现类
* *
@ -22,9 +27,15 @@ public class CheckItemServiceImpl implements CheckItemService {
@Resource @Resource
private CheckItemMapper checkItemMapper; private CheckItemMapper checkItemMapper;
@Resource
private InspPlanItemMapper inspPlanItemMapper;
@Resource
private DictDataMapper dictDataMapper;
@Override @Override
public Integer createCheckItem(CheckItemSaveReqVO createReqVO) { public Integer createCheckItem(CheckItemSaveReqVO createReqVO) {
// 校验同类下检验项名称不重复
validateItemNameUnique(null, createReqVO.getItemType(), createReqVO.getItemName());
// 插入 // 插入
CheckItemDO checkItem = BeanUtils.toBean(createReqVO, CheckItemDO.class); CheckItemDO checkItem = BeanUtils.toBean(createReqVO, CheckItemDO.class);
checkItemMapper.insert(checkItem); checkItemMapper.insert(checkItem);
@ -36,6 +47,8 @@ public class CheckItemServiceImpl implements CheckItemService {
public void updateCheckItem(CheckItemSaveReqVO updateReqVO) { public void updateCheckItem(CheckItemSaveReqVO updateReqVO) {
// 校验存在 // 校验存在
validateCheckItemExists(updateReqVO.getId()); validateCheckItemExists(updateReqVO.getId());
// 校验同类下检验项名称不重复
validateItemNameUnique(updateReqVO.getId(), updateReqVO.getItemType(), updateReqVO.getItemName());
// 更新 // 更新
CheckItemDO updateObj = BeanUtils.toBean(updateReqVO, CheckItemDO.class); CheckItemDO updateObj = BeanUtils.toBean(updateReqVO, CheckItemDO.class);
checkItemMapper.updateById(updateObj); checkItemMapper.updateById(updateObj);
@ -43,18 +56,42 @@ public class CheckItemServiceImpl implements CheckItemService {
@Override @Override
public void deleteCheckItem(Integer id) { public void deleteCheckItem(Integer id) {
// 校验存在 // 校验存在
validateCheckItemExists(id); validateCheckItemExists(id);
Long count = inspPlanItemMapper.selectByItemIdCount(id);
if (count > 0) {
throw exception("该检验标准已做质检方案,不允许删除,请确认。");
}
// 删除 // 删除
checkItemMapper.deleteById(id); checkItemMapper.deleteById(id);
} }
private void validateCheckItemExists(Integer id) { private void validateCheckItemExists(Integer id) {
if (checkItemMapper.selectById(id) == null) { if (checkItemMapper.selectById(id) == null) {
// throw exception(CHECK_ITEM_NOT_EXISTS); throw exception("数据不存在");
} }
} }
/**
* 校验同类下检验项名称不重复
*/
private void validateItemNameUnique(Integer id, String itemType, String itemName) {
Long count = checkItemMapper.selectCountByItemTypeAndItemName(itemType, itemName, id);
if (count > 0) {
String itemTypeName = getItemTypeName(itemType);
throw exception(itemTypeName + "内已存在检验名称为" + itemName + "的检验项,请确认!");
}
}
/**
* 获取适用类型名称
*/
private String getItemTypeName(String itemType) {
DictDataDO dictData = dictDataMapper.selectByDictTypeAndValue("mat_type", itemType);
return dictData != null ? dictData.getLabel() : itemType;
}
@Override @Override
public CheckItemDO getCheckItem(Integer id) { public CheckItemDO getCheckItem(Integer id) {
return checkItemMapper.selectById(id); return checkItemMapper.selectById(id);

View File

@ -56,4 +56,5 @@ public interface ProcService {
List<ProcRespVO> getProcDropdown(String keyWord); List<ProcRespVO> getProcDropdown(String keyWord);
List<ProcRespVO> getProcList();
} }

View File

@ -92,4 +92,10 @@ public class ProcServiceImpl implements ProcService {
return BeanUtils.toBean(procDOS, ProcRespVO.class); return BeanUtils.toBean(procDOS, ProcRespVO.class);
} }
@Override
public List<ProcRespVO> getProcList() {
List<ProcDO> procDOS = procMapper.getProcList();
return BeanUtils.toBean(procDOS, ProcRespVO.class);
}
} }

View File

@ -0,0 +1,55 @@
package com.ningxia.yunxi.chemmes.module.biz.service.storearea;
import java.util.*;
import javax.validation.*;
import com.ningxia.yunxi.chemmes.module.biz.controller.admin.storearea.vo.*;
import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.storearea.StoreAreaDO;
import com.ningxia.yunxi.chemmes.framework.common.pojo.PageResult;
import com.ningxia.yunxi.chemmes.framework.common.pojo.PageParam;
/**
* 库区主数据 Service 接口
*
* @author 管理员
*/
public interface StoreAreaService {
/**
* 创建库区主数据
*
* @param createReqVO 创建信息
* @return 编号
*/
Integer createStoreArea(@Valid StoreAreaSaveReqVO createReqVO);
/**
* 更新库区主数据
*
* @param updateReqVO 更新信息
*/
void updateStoreArea(@Valid StoreAreaSaveReqVO updateReqVO);
/**
* 删除库区主数据
*
* @param id 编号
*/
void deleteStoreArea(Integer id);
/**
* 获得库区主数据
*
* @param id 编号
* @return 库区主数据
*/
StoreAreaDO getStoreArea(Integer id);
/**
* 获得库区主数据分页
*
* @param pageReqVO 分页查询
* @return 库区主数据分页
*/
PageResult<StoreAreaDO> getStoreAreaPage(StoreAreaPageReqVO pageReqVO);
}

View File

@ -0,0 +1,83 @@
package com.ningxia.yunxi.chemmes.module.biz.service.storearea;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import com.ningxia.yunxi.chemmes.module.biz.controller.admin.storearea.vo.*;
import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.storearea.StoreAreaDO;
import com.ningxia.yunxi.chemmes.framework.common.pojo.PageResult;
import com.ningxia.yunxi.chemmes.framework.common.pojo.PageParam;
import com.ningxia.yunxi.chemmes.framework.common.util.object.BeanUtils;
import com.ningxia.yunxi.chemmes.module.biz.dal.mysql.storearea.StoreAreaMapper;
import static com.ningxia.yunxi.chemmes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.ningxia.yunxi.chemmes.module.biz.enums.ErrorCodeConstants.*;
/**
* 库区主数据 Service 实现类
*
* @author 管理员
*/
@Service
@Validated
public class StoreAreaServiceImpl implements StoreAreaService {
@Resource
private StoreAreaMapper storeAreaMapper;
@Override
public Integer createStoreArea(StoreAreaSaveReqVO createReqVO) {
Long count = storeAreaMapper.selectByStoreAreCodeCount(createReqVO.getStoreAreCd(),createReqVO.getId());
if (count > 0) {
throw exception("库区编码已存在,请重新输入!");
}
// 插入
StoreAreaDO storeArea = BeanUtils.toBean(createReqVO, StoreAreaDO.class);
storeAreaMapper.insert(storeArea);
// 返回
return storeArea.getId();
}
@Override
public void updateStoreArea(StoreAreaSaveReqVO updateReqVO) {
Long count = storeAreaMapper.selectByStoreAreCodeCount(updateReqVO.getStoreAreCd(),updateReqVO.getId());
if (count > 0) {
throw exception("库区编码已存在,请重新输入!");
}
// 校验存在
validateStoreAreaExists(updateReqVO.getId());
// 更新
StoreAreaDO updateObj = BeanUtils.toBean(updateReqVO, StoreAreaDO.class);
storeAreaMapper.updateById(updateObj);
}
@Override
public void deleteStoreArea(Integer id) {
// 校验存在
validateStoreAreaExists(id);
// 删除
storeAreaMapper.deleteById(id);
}
private void validateStoreAreaExists(Integer id) {
if (storeAreaMapper.selectById(id) == null) {
throw exception("数据不存在");
}
}
@Override
public StoreAreaDO getStoreArea(Integer id) {
return storeAreaMapper.selectById(id);
}
@Override
public PageResult<StoreAreaDO> getStoreAreaPage(StoreAreaPageReqVO pageReqVO) {
return storeAreaMapper.selectPage(pageReqVO);
}
}

View File

@ -52,4 +52,5 @@ public interface StoreHouseService {
*/ */
PageResult<StoreHouseDO> getStoreHousePage(StoreHousePageReqVO pageReqVO); PageResult<StoreHouseDO> getStoreHousePage(StoreHousePageReqVO pageReqVO);
List<StoreHouseDO> getStoreHouseSelect();
} }

View File

@ -11,6 +11,10 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.List;
import static com.ningxia.yunxi.chemmes.framework.common.exception.util.ServiceExceptionUtil.exception;
/** /**
* 仓储主数据 Service 实现类 * 仓储主数据 Service 实现类
* *
@ -25,6 +29,11 @@ public class StoreHouseServiceImpl implements StoreHouseService {
@Override @Override
public Integer createStoreHouse(StoreHouseSaveReqVO createReqVO) { public Integer createStoreHouse(StoreHouseSaveReqVO createReqVO) {
Long count = storeHouseMapper.selectByStoreHouseCodeCount(createReqVO.getStoreHouseCd(),null);
if (count > 0) {
throw exception("仓储编码已存在,请重新输入!");
}
// 插入 // 插入
StoreHouseDO storeHouse = BeanUtils.toBean(createReqVO, StoreHouseDO.class); StoreHouseDO storeHouse = BeanUtils.toBean(createReqVO, StoreHouseDO.class);
storeHouseMapper.insert(storeHouse); storeHouseMapper.insert(storeHouse);
@ -34,8 +43,12 @@ public class StoreHouseServiceImpl implements StoreHouseService {
@Override @Override
public void updateStoreHouse(StoreHouseSaveReqVO updateReqVO) { public void updateStoreHouse(StoreHouseSaveReqVO updateReqVO) {
Long count = storeHouseMapper.selectByStoreHouseCodeCount(updateReqVO.getStoreHouseCd(),updateReqVO.getId());
if (count > 0) {
throw exception("仓储编码已存在,请重新输入!");
}
// 校验存在 // 校验存在
validateStoreHouseExists(updateReqVO.getId()); // validateStoreHouseExists(updateReqVO.getId());
// 更新 // 更新
StoreHouseDO updateObj = BeanUtils.toBean(updateReqVO, StoreHouseDO.class); StoreHouseDO updateObj = BeanUtils.toBean(updateReqVO, StoreHouseDO.class);
storeHouseMapper.updateById(updateObj); storeHouseMapper.updateById(updateObj);
@ -51,7 +64,7 @@ public class StoreHouseServiceImpl implements StoreHouseService {
private void validateStoreHouseExists(Integer id) { private void validateStoreHouseExists(Integer id) {
if (storeHouseMapper.selectById(id) == null) { if (storeHouseMapper.selectById(id) == null) {
// throw exception(STORE_HOUSE_NOT_EXISTS); throw exception("数据不存在");
} }
} }
@ -65,4 +78,9 @@ public class StoreHouseServiceImpl implements StoreHouseService {
return storeHouseMapper.selectPage(pageReqVO); return storeHouseMapper.selectPage(pageReqVO);
} }
@Override
public List<StoreHouseDO> getStoreHouseSelect() {
return storeHouseMapper.getStoreHouseSelect();
}
} }

View File

@ -11,6 +11,8 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
import static com.ningxia.yunxi.chemmes.framework.common.exception.util.ServiceExceptionUtil.exception;
/** /**
* 工艺流程主数据 Service 实现类 * 工艺流程主数据 Service 实现类
* *
@ -25,6 +27,10 @@ public class TechProcServiceImpl implements TechProcService {
@Override @Override
public Integer createTechProc(TechProcSaveReqVO createReqVO) { public Integer createTechProc(TechProcSaveReqVO createReqVO) {
Long count = techProcMapper.selectByTechProcCount(createReqVO.getTechProc(),null);
if (count > 0) {
throw exception("工艺流程已存在,请重新选择!");
}
// 插入 // 插入
TechProcDO techProc = BeanUtils.toBean(createReqVO, TechProcDO.class); TechProcDO techProc = BeanUtils.toBean(createReqVO, TechProcDO.class);
techProcMapper.insert(techProc); techProcMapper.insert(techProc);
@ -34,6 +40,10 @@ public class TechProcServiceImpl implements TechProcService {
@Override @Override
public void updateTechProc(TechProcSaveReqVO updateReqVO) { public void updateTechProc(TechProcSaveReqVO updateReqVO) {
Long count = techProcMapper.selectByTechProcCount(updateReqVO.getTechProc(),updateReqVO.getId());
if (count > 0) {
throw exception("工艺流程已存在,请重新选择!");
}
// 校验存在 // 校验存在
validateTechProcExists(updateReqVO.getId()); validateTechProcExists(updateReqVO.getId());
// 更新 // 更新
@ -51,7 +61,7 @@ public class TechProcServiceImpl implements TechProcService {
private void validateTechProcExists(Integer id) { private void validateTechProcExists(Integer id) {
if (techProcMapper.selectById(id) == null) { if (techProcMapper.selectById(id) == null) {
// throw exception(TECH_PROC_NOT_EXISTS); throw exception("数据不存在");
} }
} }

View File

@ -60,7 +60,7 @@ spring:
redis: redis:
host: 218.95.153.170 # 地址 host: 218.95.153.170 # 地址
port: 6379 # 端口 port: 6379 # 端口
database: 9 # 数据库索引 database: 8 # 数据库索引
password: 'qweasd,.123' # 密码,建议生产环境开启 password: 'qweasd,.123' # 密码,建议生产环境开启
--- #################### 定时任务相关配置 #################### --- #################### 定时任务相关配置 ####################

View File

@ -59,7 +59,7 @@ spring:
redis: redis:
host: localhost # 地址 host: localhost # 地址
port: 6379 # 端口 port: 6379 # 端口
database: 9 # 数据库索引 database: 8 # 数据库索引
password: 'qweasd,.123' # 密码,建议生产环境开启 password: 'qweasd,.123' # 密码,建议生产环境开启
--- #################### 定时任务相关配置 #################### --- #################### 定时任务相关配置 ####################

View File

@ -42,3 +42,7 @@ export const exportProc = async (params) => {
export const getProcDropdown = async (params) => { export const getProcDropdown = async (params) => {
return await request.get({ url: `/biz/proc/dropdown`, params }) return await request.get({ url: `/biz/proc/dropdown`, params })
} }
// 获取工序下拉列表
export const getProcList = async () => {
return await request.get({ url: `/biz/proc/getProcList` })
}

View File

@ -0,0 +1,42 @@
import request from '@/config/axios'
export interface StoreAreaVO {
id: number
fCreatorUserId: string
storeAreCd: string
storeAreaName: string
enabledStatus: number
remark: string
storeHouseId: number
storeType: string
}
// 查询库区主数据分页
export const getStoreAreaPage = async (params) => {
return await request.get({ url: `/biz/store-area/page`, params })
}
// 查询库区主数据详情
export const getStoreArea = async (id: number) => {
return await request.get({ url: `/biz/store-area/get?id=` + id })
}
// 新增库区主数据
export const createStoreArea = async (data: StoreAreaVO) => {
return await request.post({ url: `/biz/store-area/create`, data })
}
// 修改库区主数据
export const updateStoreArea = async (data: StoreAreaVO) => {
return await request.put({ url: `/biz/store-area/update`, data })
}
// 删除库区主数据
export const deleteStoreArea = async (id: number) => {
return await request.delete({ url: `/biz/store-area/delete?id=` + id })
}
// 导出库区主数据 Excel
export const exportStoreArea = async (params) => {
return await request.download({ url: `/biz/store-area/export-excel`, params })
}

View File

@ -38,3 +38,7 @@ export const deleteStoreHouse = async (id: number) => {
export const exportStoreHouse = async (params) => { export const exportStoreHouse = async (params) => {
return await request.download({ url: `/biz/store-house/export-excel`, params }) return await request.download({ url: `/biz/store-house/export-excel`, params })
} }
//获取仓储主数据下拉列表
export const getStoreHouseSelect = async () => {
return await request.get({ url: `/biz/store-house/get-store-house-select`})
}

View File

@ -131,7 +131,7 @@ export enum DICT_TYPE {
SYSTEM_NOTIFY_TEMPLATE_TYPE = 'system_notify_template_type', SYSTEM_NOTIFY_TEMPLATE_TYPE = 'system_notify_template_type',
SYSTEM_SOCIAL_TYPE = 'system_social_type', SYSTEM_SOCIAL_TYPE = 'system_social_type',
SYSTEM_STATUS = 'system_status', SYSTEM_STATUS = 'system_status',
SYSTEM_IS_CELL = 'system_is_cell', SYSTEM_IS_CELL = 'system_is_cell',//是否
// ========== INFRA 模块 ========== // ========== INFRA 模块 ==========
INFRA_BOOLEAN_STRING = 'infra_boolean_string', INFRA_BOOLEAN_STRING = 'infra_boolean_string',

View File

@ -1,45 +1,51 @@
<template> <template>
<Dialog :title="dialogTitle" v-model="dialogVisible"> <Dialog :title="dialogTitle" v-model="dialogVisible" width="800px" @close="cancel">
<el-form <el-form
ref="formRef" ref="formRef"
:model="formData" :model="formData"
:rules="formRules" :rules="formData.itemType=='3'?formRules:formRules1"
label-width="100px" label-width="120px"
v-loading="formLoading" v-loading="formLoading"
:validate-on-rule-change="false"
:key="formData.itemType"
> >
<el-form-item label="检验项编号" prop="itemNo"> <el-row :gutter="15">
<el-input v-model="formData.itemNo" placeholder="请输入检验项编号" /> <el-col :span="12">
<el-form-item label="编号" prop="itemNo">
<el-input v-model="formData.itemNo" placeholder="请输入检验项编号" class="!w-240px"/>
</el-form-item> </el-form-item>
<el-form-item label="检验项名称" prop="itemName"> </el-col>
<el-input v-model="formData.itemName" placeholder="请输入检验项名称" /> <el-col :span="12">
<el-form-item label="名称" prop="itemName">
<el-input v-model="formData.itemName" placeholder="请输入名称" class="!w-240px"/>
</el-form-item> </el-form-item>
<el-form-item label="性质1 表示定性2 表示定量" prop="nature"> </el-col>
<el-input v-model="formData.nature" placeholder="请输入性质1 表示定性2 表示定量" /> </el-row>
</el-form-item> <el-row :gutter="15">
<el-form-item label="单位" prop="unitName"> <el-col :span="12">
<el-input v-model="formData.unitName" placeholder="请输入单位" /> <el-form-item label="性质" prop="nature">
</el-form-item> <el-radio-group v-model="formData.nature">
<el-form-item label="检验方法" prop="checkMethod"> <el-radio
<el-input v-model="formData.checkMethod" placeholder="请输入检验方法" /> v-for="dict in getStrDictOptions(DICT_TYPE.NATURE)"
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" />
</el-form-item>
<el-form-item label="适用类型1表示原材料 2表示半成品 3表示成品" prop="itemType">
<el-select v-model="formData.itemType" placeholder="请选择适用类型1表示原材料 2表示半成品 3表示成品">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.MAT_TYPE)"
:key="dict.value" :key="dict.value"
:label="dict.label" :label="dict.value"
:value="dict.value" >
/> {{ dict.label }}
</el-select> </el-radio>
</el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="检验大类" prop="itemClass"> </el-col>
<el-input v-model="formData.itemClass" placeholder="请输入检验大类" /> <el-col :span="12">
<el-form-item label="单位" prop="unitName">
<el-input v-model="formData.unitName" placeholder="请输入单位" class="!w-240px"/>
</el-form-item> </el-form-item>
<el-form-item label="检验值类型( I -数字 T- 文本)" prop="itemValueType"> </el-col>
<el-select v-model="formData.itemValueType" placeholder="请选择检验值类型( I -数字 T- 文本)"> </el-row>
<el-row :gutter="15">
<el-col :span="12">
<el-form-item label="检验值类型" prop="itemValueType">
<el-select v-model="formData.itemValueType" placeholder="请选择检验值类型" @change="handleItemValueTypeChange">
<el-option <el-option
v-for="dict in getStrDictOptions(DICT_TYPE.TEST_VALUE_TYPE)" v-for="dict in getStrDictOptions(DICT_TYPE.TEST_VALUE_TYPE)"
:key="dict.value" :key="dict.value"
@ -48,30 +54,103 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="绑定输入文本(符合,不符合)" prop="itemContent"> </el-col>
<Editor v-model="formData.itemContent" height="150px" /> <el-col :span="12">
<el-form-item label="适用类型" prop="itemType">
<el-select v-model="formData.itemType" placeholder="请选择适用类型" @change="handleItemTypeChange">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.MAT_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item> </el-form-item>
</el-col>
</el-row>
<el-row :gutter="15">
<el-col :span="12">
<el-form-item label="检验值数量" prop="testNum"> <el-form-item label="检验值数量" prop="testNum">
<el-input v-model="formData.testNum" placeholder="请输入检验值数量" /> <el-input v-model="formData.testNum" placeholder="请输入检验值数量" class="!w-240px"/>
</el-form-item> </el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="绑定值" prop="itemContent">
<el-input v-model="formData.itemContent" class="!w-240px" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="15">
<el-col :span="12">
<el-form-item label="是否取平均值" prop="printAvgValues">
<el-radio-group v-model="formData.printAvgValues">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.SYSTEM_IS_CELL)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="小数位数" prop="floatNum"> <el-form-item label="小数位数" prop="floatNum">
<el-input v-model="formData.floatNum" placeholder="请输入小数位数" /> <el-input v-model="formData.floatNum" placeholder="请输入小数位数" class="!w-240px" />
</el-form-item> </el-form-item>
<el-form-item label="打印是否取平均值" prop="printAvgValues"> </el-col>
<el-input v-model="formData.printAvgValues" placeholder="请输入打印是否取平均值" /> </el-row>
<el-row :gutter="15">
<el-col :span="12">
<el-form-item label="检验大类" prop="itemClass">
<el-select v-model="formData.itemClass" placeholder="请选择检验大类" v-if="formData.itemType=='3'">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.FINISHED_PRODUCT_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
<el-select v-model="formData.itemClass" placeholder="请选择检验大类" v-if="formData.itemType=='1'">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.RAW_MATERIALS_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
<el-select v-model="formData.itemClass" placeholder="请选择检验大类" v-if="formData.itemType=='2'||!formData.itemType" disabled/>
</el-form-item> </el-form-item>
</el-col>
</el-row>
<el-row :gutter="15">
<el-col :span="24">
<el-form-item label="检验方法" prop="checkMethod">
<el-input type="textarea" :rows="4" v-model="formData.checkMethod" placeholder="请输入检验方法"/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="15">
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input type="textarea" :rows="4" v-model="formData.remark" placeholder="请输入备注"/>
</el-form-item>
</el-col>
</el-row>
</el-form> </el-form>
<template #footer> <template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button> <el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button> <el-button @click="cancel"> </el-button>
</template> </template>
</Dialog> </Dialog>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { getStrDictOptions, DICT_TYPE } from '@/utils/dict' import {getStrDictOptions, DICT_TYPE, getIntDictOptions} from '@/utils/dict'
import * as CheckItemApi from '@/api/biz/checkitem' import * as CheckItemApi from '@/api/biz/checkitem'
const { t } = useI18n() // const {t} = useI18n() //
const message = useMessage() // const message = useMessage() //
const dialogVisible = ref(false) // const dialogVisible = ref(false) //
@ -79,22 +158,51 @@ const dialogTitle = ref('') // 弹窗的标题
const formLoading = ref(false) // 12 const formLoading = ref(false) // 12
const formType = ref('') // create - update - const formType = ref('') // create - update -
const formData = ref({ const formData = ref({
id: undefined, id: undefined as number | undefined,
itemNo: undefined, itemNo: undefined as string | undefined,
itemName: undefined, itemName: undefined as string | undefined,
nature: undefined, nature: undefined as string | undefined,
unitName: undefined, unitName: undefined as string | undefined,
checkMethod: undefined, checkMethod: undefined as string | undefined,
remark: undefined, remark: undefined as string | undefined,
itemType: undefined, itemType: undefined as string | undefined,
itemClass: undefined, itemClass: undefined as string | undefined,
itemValueType: undefined, itemValueType: undefined as string | undefined,
itemContent: undefined, itemContent: undefined as string | undefined,
testNum: undefined, testNum: undefined as string | undefined,
floatNum: undefined, floatNum: undefined as number | string | undefined,
printAvgValues: undefined, printAvgValues: "0" as string | undefined,
}) })
const formRules = reactive({ const formRules = reactive({
itemName: [
{ required: true, message: '请输入名称', trigger: 'blur' }
],
nature: [
{ required: true, message: '性质不能为空', trigger: 'change' }
],
itemType: [
{ required: true, message: '请选择适用类型', trigger: 'change' }
],
itemContent: [
{ pattern: /^[\w\u4e00-\u9fa5]+(,[\w\u4e00-\u9fa5]+)*$/, message: '格式错误', trigger: 'blur' }
],
itemClass: [
{ required: true, message: '检验大类', trigger: 'change' }
]
})
const formRules1 = reactive({
itemName: [
{ required: true, message: '请输入名称', trigger: 'blur' }
],
nature: [
{ required: true, message: '性质不能为空', trigger: 'change' }
],
itemType: [
{ required: true, message: '请选择适用类型', trigger: 'change' }
],
itemContent: [
{ pattern: /^[\w\u4e00-\u9fa5]+(,[\w\u4e00-\u9fa5]+)*$/, message: '格式错误', trigger: 'blur' }
]
}) })
const formRef = ref() // Ref const formRef = ref() // Ref
@ -114,13 +222,43 @@ const open = async (type: string, id?: number) => {
} }
} }
} }
defineExpose({ open }) // open defineExpose({open}) // open
/** 适用类型变化 */
const handleItemTypeChange = () => {
formData.value.itemClass = undefined
}
/** 检验值类型变化 */
const handleItemValueTypeChange = (row: string) => {
if (row === 'I') {
formData.value.floatNum = 2
} else {
formData.value.floatNum = ''
}
}
const cancel = async () => {
dialogVisible.value = false
emit('success')
}
/** 提交表单 */ /** 提交表单 */
const emit = defineEmits(['success']) // success const emit = defineEmits(['success']) // success
const submitForm = async () => { const submitForm = async () => {
// //
await formRef.value.validate() await formRef.value.validate()
//
if (formData.value.itemValueType === 'I' && formData.value.itemContent != null && formData.value.itemContent !== '') {
message.error('检验值类型为数字类型,绑定值必须为空,请确认')
return
}
if (formData.value.itemValueType === 'T' && formData.value.floatNum != null && formData.value.floatNum !== '') {
message.error('检验值类型为文本类型,小数位数必须为空,请确认')
return
}
if (formData.value.itemValueType === 'I' && (formData.value.floatNum == null || formData.value.floatNum === '')) {
message.error('检验值类型为数字类型,小数位数必须输入,请确认')
return
}
// //
formLoading.value = true formLoading.value = true
try { try {
@ -156,7 +294,7 @@ const resetForm = () => {
itemContent: undefined, itemContent: undefined,
testNum: undefined, testNum: undefined,
floatNum: undefined, floatNum: undefined,
printAvgValues: undefined, printAvgValues: "0",
} }
formRef.value?.resetFields() formRef.value?.resetFields()
} }

View File

@ -6,57 +6,12 @@
:model="queryParams" :model="queryParams"
ref="queryFormRef" ref="queryFormRef"
:inline="true" :inline="true"
label-width="68px" label-width="80px"
> >
<el-form-item label="检验项名称" prop="itemName"> <el-form-item label="适用类型" prop="itemType">
<el-input
v-model="queryParams.itemName"
placeholder="请输入检验项名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="性质1 表示定性2 表示定量" prop="nature">
<el-input
v-model="queryParams.nature"
placeholder="请输入性质1 表示定性2 表示定量"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="单位" prop="unitName">
<el-input
v-model="queryParams.unitName"
placeholder="请输入单位"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="检验方法" prop="checkMethod">
<el-input
v-model="queryParams.checkMethod"
placeholder="请输入检验方法"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input
v-model="queryParams.remark"
placeholder="请输入备注"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="适用类型1表示原材料 2表示半成品 3表示成品" prop="itemType">
<el-select <el-select
v-model="queryParams.itemType" v-model="queryParams.itemType"
placeholder="请选择适用类型1表示原材料 2表示半成品 3表示成品" placeholder="请选择适用类型"
clearable clearable
class="!w-240px" class="!w-240px"
> >
@ -68,52 +23,19 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="检验大类" prop="itemClass"> <el-form-item label="编号" prop="itemNo">
<el-input <el-input
v-model="queryParams.itemClass" v-model="queryParams.itemNo"
placeholder="请输入检验大类" placeholder="请输入编号"
clearable clearable
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
class="!w-240px" class="!w-240px"
/> />
</el-form-item> </el-form-item>
<el-form-item label="检验值类型( I -数字 T- 文本)" prop="itemValueType"> <el-form-item label="检验名称" prop="itemName">
<el-select
v-model="queryParams.itemValueType"
placeholder="请选择检验值类型( I -数字 T- 文本)"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.TEST_VALUE_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="检验值数量" prop="testNum">
<el-input <el-input
v-model="queryParams.testNum" v-model="queryParams.itemName"
placeholder="请输入检验值数量" placeholder="请输入检验名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="小数位数" prop="floatNum">
<el-input
v-model="queryParams.floatNum"
placeholder="请输入小数位数"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="打印是否取平均值" prop="printAvgValues">
<el-input
v-model="queryParams.printAvgValues"
placeholder="请输入打印是否取平均值"
clearable clearable
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
class="!w-240px" class="!w-240px"
@ -130,62 +52,51 @@
> >
<Icon icon="ep:plus" class="mr-5px" /> 新增 <Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button> </el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['biz:check-item:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</ContentWrap> </ContentWrap>
<!-- 列表 --> <!-- 列表 -->
<ContentWrap> <ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true"> <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" border>
<el-table-column label="自增字段" align="center" prop="id" /> <el-table-column type="index" label="序号" align="center" min-width="60" />
<el-table-column label="检验项编号" align="center" prop="itemNo" /> <el-table-column label="名称" align="center" prop="itemName" width="180"/>
<el-table-column label="检验项名称" align="center" prop="itemName" /> <el-table-column label="性质" align="center" prop="nature" width="120">
<el-table-column label="性质1 表示定性2 表示定量" align="center" prop="nature">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.NATURE" :value="scope.row.nature" /> <dict-tag :type="DICT_TYPE.NATURE" :value="scope.row.nature" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="单位" align="center" prop="unitName" /> <el-table-column label="检验大类" align="center" prop="itemClass" width="120">
<el-table-column label="检验方法" align="center" prop="checkMethod" /> <template #default="scope">
<el-table-column label="备注" align="center" prop="remark" /> <dict-tag :type="DICT_TYPE.RAW_MATERIALS_TYPE" :value="scope.row.itemType" v-if="scope.row.itemType==1"/>
<el-table-column label="适用类型1表示原材料 2表示半成品 3表示成品" align="center" prop="itemType"> <dict-tag :type="DICT_TYPE.FINISHED_PRODUCT_TYPE" :value="scope.row.itemType" v-if="scope.row.itemType==3"/>
<span v-if="scope.row.itemType!=1 && scope.row.itemType!=3"></span>
</template>
</el-table-column>
<el-table-column label="单位" align="center" prop="unitName" width="120"/>
<el-table-column label="检验方法" align="center" prop="checkMethod" width="200"/>
<el-table-column label="适用类型" align="center" prop="itemType" width="120">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.MAT_TYPE" :value="scope.row.itemType" /> <dict-tag :type="DICT_TYPE.MAT_TYPE" :value="scope.row.itemType" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column label="检验值类型" align="center" prop="itemValueType" width="120">
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="检验大类" align="center" prop="itemClass" />
<el-table-column label="检验值类型( I -数字 T- 文本)" align="center" prop="itemValueType">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.TEST_VALUE_TYPE" :value="scope.row.itemValueType" /> <dict-tag :type="DICT_TYPE.TEST_VALUE_TYPE" :value="scope.row.itemValueType" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="绑定输入文本(符合,不符合)" align="center" prop="itemContent" /> <el-table-column label="检验值数量" align="center" prop="testNum" width="120"/>
<el-table-column label="检验值数量" align="center" prop="testNum" /> <el-table-column label="绑定值" align="center" prop="itemContent" width="200"/>
<el-table-column label="小数位数" align="center" prop="floatNum" /> <el-table-column label="小数位数" align="center" prop="floatNum" width="120" />
<el-table-column label="打印是否取平均值" align="center" prop="printAvgValues" /> <el-table-column label="备注" align="center" prop="remark" width="200"/>
<el-table-column label="操作" align="center"> <el-table-column label="编号" align="center" prop="itemNo" />
<el-table-column label="操作" align="center" width="120" fixed="right">
<template #default="scope"> <template #default="scope">
<el-button <el-button
link link
type="primary" type="primary"
@click="openForm('update', scope.row.id)" @click="openForm('update', scope.row.id)"
v-hasPermi="['biz:check-item:update']"
> >
编辑 编辑
</el-button> </el-button>
@ -193,14 +104,13 @@
link link
type="danger" type="danger"
@click="handleDelete(scope.row.id)" @click="handleDelete(scope.row.id)"
v-hasPermi="['biz:check-item:delete']"
> >
删除 删除
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<!-- 分页 -->
<Pagination <Pagination
:total="total" :total="total"
v-model:page="queryParams.pageNo" v-model:page="queryParams.pageNo"
@ -215,8 +125,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { getStrDictOptions, DICT_TYPE } from '@/utils/dict' import { getStrDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import * as CheckItemApi from '@/api/biz/checkitem' import * as CheckItemApi from '@/api/biz/checkitem'
import CheckItemForm from './CheckItemForm.vue' import CheckItemForm from './CheckItemForm.vue'
@ -225,7 +133,7 @@ defineOptions({ name: 'CheckItem' })
const message = useMessage() // const message = useMessage() //
const { t } = useI18n() // const { t } = useI18n() //
const loading = ref(true) // const loading = ref(false) //
const list = ref([]) // const list = ref([]) //
const total = ref(0) // const total = ref(0) //
const queryParams = reactive({ const queryParams = reactive({
@ -243,9 +151,9 @@ const queryParams = reactive({
testNum: undefined, testNum: undefined,
floatNum: undefined, floatNum: undefined,
printAvgValues: undefined, printAvgValues: undefined,
itemNo:undefined,
}) })
const queryFormRef = ref() // const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */ /** 查询列表 */
const getList = async () => { const getList = async () => {
@ -290,23 +198,10 @@ const handleDelete = async (id: number) => {
} catch {} } catch {}
} }
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await CheckItemApi.exportCheckItem(queryParams)
download.excel(data, '检验项目.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/ /** 初始化 **/
onMounted(() => { onMounted(() => {
getList() // getList()
}) })
</script> </script>

View File

@ -0,0 +1,151 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
@close="cancel"
>
<el-form-item label="仓库" prop="storeHouseId">
<el-select class="!w-240px" v-model="formData.storeHouseId" clearable filterable @change="handleStoreHouseChange">
<el-option
v-for="dict in storeHouseList"
:key="dict.id"
:label="dict.storeHouseName"
:value="dict.id"
/>
</el-select> </el-form-item>
<el-form-item label="库区编码" prop="storeAreCd">
<el-input v-model="formData.storeAreCd" placeholder="请输入库区编码" class="!w-240px" :disabled="formData.id"/>
</el-form-item>
<el-form-item label="库区名称" prop="storeAreaName">
<el-input v-model="formData.storeAreaName" placeholder="请输入库区名称" class="!w-240px"/>
</el-form-item>
<el-form-item label="状态" prop="enabledStatus">
<el-select v-model="formData.enabledStatus" placeholder="请选择状态">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input type='textarea' :rows="4" v-model="formData.remark" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="cancel"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import * as StoreAreaApi from '@/api/biz/storearea'
import * as StoreHouseApi from '@/api/biz/storehouse'
const { t } = useI18n() //
const message = useMessage() //
const storeHouseList = ref()
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
fCreatorUserId: undefined,
storeAreCd: undefined,
storeAreaName: undefined,
enabledStatus: 0,
remark: undefined,
storeHouseId: undefined,
storeType: undefined,
})
const formRules = reactive({
storeHouseId: [{ required: true, message: '仓库不能为空', trigger: 'change' }],
storeAreCd: [{ required: true, message: '库区编码不能为空', trigger: 'blur' }],
storeAreaName: [{ required: true, message: '库区名称不能为空', trigger: 'blur' }],
enabledStatus: [{ required: true, message: '状态不能为空', trigger: 'change' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
storeHouseList.value = await StoreHouseApi.getStoreHouseSelect()
//
if (id) {
formLoading.value = true
try {
formData.value = await StoreAreaApi.getStoreArea(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
const cancel = async () => {
dialogVisible.value = false
emit('success')
}
/** 仓库选择变化事件 */
const handleStoreHouseChange = (storeHouseId: number) => {
if (!storeHouseId) {
formData.value.storeType = undefined
return
}
const selectedStore = storeHouseList.value.find((item: any) => item.id === storeHouseId)
if (selectedStore) {
formData.value.storeType = selectedStore.storeType
}
}
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as StoreAreaApi.StoreAreaVO
if (formType.value === 'create') {
await StoreAreaApi.createStoreArea(data)
message.success(t('common.createSuccess'))
} else {
await StoreAreaApi.updateStoreArea(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
fCreatorUserId: undefined,
storeAreCd: undefined,
storeAreaName: undefined,
enabledStatus: 0,
remark: undefined,
storeHouseId: undefined,
storeType: undefined,
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,202 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="80px"
>
<el-form-item label="仓库类型" prop="storeType">
<el-select
v-model="queryParams.storeType"
placeholder="请选择仓库类型"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.WAREHOUSE_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="仓库名称" prop="storeHouseName">
<el-input
v-model="queryParams.storeHouseName"
placeholder="请输入仓库名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="状态" prop="enabledStatus">
<el-select
v-model="queryParams.enabledStatus"
placeholder="请选择状态"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" border>
<el-table-column type="index" label="序号" align="center" min-width="60" />
<el-table-column label="仓库名称" align="center" prop="storeHouseName" />
<el-table-column label="仓库类型" align="center" prop="storeType" >
<template #default="scope">
<dict-tag :type="DICT_TYPE.WAREHOUSE_TYPE" :value="scope.row.storeType" />
</template>
</el-table-column>
<el-table-column label="库区编码" align="center" prop="storeAreCd" />
<el-table-column label="库区名称" align="center" prop="storeAreaName" />
<el-table-column label="状态" align="center" prop="enabledStatus">
<template #default="scope">
<dict-tag :type="DICT_TYPE.SYSTEM_STATUS" :value="scope.row.enabledStatus" />
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter2"
width="180px"
/>
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
>
编辑
</el-button>
<!-- <el-button-->
<!-- link-->
<!-- type="danger"-->
<!-- @click="handleDelete(scope.row.id)"-->
<!-- v-hasPermi="['biz:store-area:delete']"-->
<!-- >-->
<!-- 删除-->
<!-- </el-button>-->
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<StoreAreaForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter2} from '@/utils/formatTime'
import * as StoreAreaApi from '@/api/biz/storearea'
import StoreAreaForm from './StoreAreaForm.vue'
defineOptions({ name: 'StoreArea' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(false) //
const list = ref([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
fCreatorUserId: undefined,
createTime: [],
storeAreCd: undefined,
storeAreaName: undefined,
enabledStatus: undefined,
remark: undefined,
storeHouseId: undefined,
storeType: undefined,
storeHouseName:undefined
})
const queryFormRef = ref() //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await StoreAreaApi.getStoreAreaPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
// const handleDelete = async (id: number) => {
// try {
// //
// await message.delConfirm()
// //
// await StoreAreaApi.deleteStoreArea(id)
// message.success(t('common.delSuccess'))
// //
// await getList()
// } catch {}
// }
/** 初始化 **/
onMounted(() => {
// getList()
})
</script>

View File

@ -1,5 +1,5 @@
<template> <template>
<Dialog :title="dialogTitle" v-model="dialogVisible"> <Dialog :title="dialogTitle" v-model="dialogVisible" @close="cancel">
<el-form <el-form
ref="formRef" ref="formRef"
:model="formData" :model="formData"
@ -7,28 +7,8 @@
label-width="100px" label-width="100px"
v-loading="formLoading" v-loading="formLoading"
> >
<el-form-item label="仓储编码" prop="storeHouseCd"> <el-form-item label="仓库类型" prop="storeType">
<el-input v-model="formData.storeHouseCd" placeholder="请输入仓储编码" /> <el-select v-model="formData.storeType" placeholder="请选择仓库类型">
</el-form-item>
<el-form-item label="仓储名称" prop="storeHouseName">
<el-input v-model="formData.storeHouseName" placeholder="请输入仓储名称" />
</el-form-item>
<el-form-item label="状态(1启用 2 未启用)" prop="enabledStatus">
<el-radio-group v-model="formData.enabledStatus">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_STATUS)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" />
</el-form-item>
<el-form-item label="仓库类型(1 原料库 2 在制品库 3 成品库)" prop="storeType">
<el-select v-model="formData.storeType" placeholder="请选择仓库类型(1 原料库 2 在制品库 3 成品库)">
<el-option <el-option
v-for="dict in getStrDictOptions(DICT_TYPE.WAREHOUSE_TYPE)" v-for="dict in getStrDictOptions(DICT_TYPE.WAREHOUSE_TYPE)"
:key="dict.value" :key="dict.value"
@ -37,15 +17,38 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="仓储编码" prop="storeHouseCd">
<el-input v-model="formData.storeHouseCd" placeholder="请输入仓储编码" class="!w-240px" :disabled="formData.id"/>
</el-form-item>
<el-form-item label="仓储名称" prop="storeHouseName">
<el-input v-model="formData.storeHouseName" placeholder="请输入仓储名称" class="!w-240px" />
</el-form-item>
<el-form-item label="状态" prop="enabledStatus">
<el-select v-model="formData.enabledStatus" placeholder="请选择状态">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input type="textarea" :rows="4" v-model="formData.remark" placeholder="请输入备注" />
</el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button> <el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button> <el-button @click="cancel"> </el-button>
</template> </template>
</Dialog> </Dialog>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { getIntDictOptions, getStrDictOptions, DICT_TYPE } from '@/utils/dict' import {getStrDictOptions, DICT_TYPE, getIntDictOptions} from '@/utils/dict'
import * as StoreHouseApi from '@/api/biz/storehouse' import * as StoreHouseApi from '@/api/biz/storehouse'
const { t } = useI18n() // const { t } = useI18n() //
@ -59,11 +62,15 @@ const formData = ref({
id: undefined, id: undefined,
storeHouseCd: undefined, storeHouseCd: undefined,
storeHouseName: undefined, storeHouseName: undefined,
enabledStatus: undefined, enabledStatus: 0,
remark: undefined, remark: undefined,
storeType: undefined, storeType: undefined,
}) })
const formRules = reactive({ const formRules = reactive({
storeType: [{ required: true, message: '仓库类型不能为空', trigger: 'change' }],
storeHouseCd: [{ required: true, message: '仓储编码不能为空', trigger: 'blur' }],
storeHouseName: [{ required: true, message: '仓储名称不能为空', trigger: 'blur' }],
enabledStatus: [{ required: true, message: '状态不能为空', trigger: 'change' }]
}) })
const formRef = ref() // Ref const formRef = ref() // Ref
@ -84,7 +91,11 @@ const open = async (type: string, id?: number) => {
} }
} }
defineExpose({ open }) // open defineExpose({ open }) // open
const cancel = async () => {
dialogVisible.value = false
emit('success')
}
/** 提交表单 */ /** 提交表单 */
const emit = defineEmits(['success']) // success const emit = defineEmits(['success']) // success
const submitForm = async () => { const submitForm = async () => {
@ -115,7 +126,7 @@ const resetForm = () => {
id: undefined, id: undefined,
storeHouseCd: undefined, storeHouseCd: undefined,
storeHouseName: undefined, storeHouseName: undefined,
enabledStatus: undefined, enabledStatus: 0,
remark: undefined, remark: undefined,
storeType: undefined, storeType: undefined,
} }

View File

@ -6,21 +6,27 @@
:model="queryParams" :model="queryParams"
ref="queryFormRef" ref="queryFormRef"
:inline="true" :inline="true"
label-width="68px" label-width="80px"
> >
<el-form-item label="仓储名称" prop="storeHouseName"> <el-form-item label="仓库类型" prop="storeType">
<el-input <el-select
v-model="queryParams.storeHouseName" v-model="queryParams.storeType"
placeholder="请输入仓储名称" placeholder="请选择仓库类型"
clearable clearable
@keyup.enter="handleQuery"
class="!w-240px" class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.WAREHOUSE_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/> />
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="状态(1启用 2 未启用)" prop="enabledStatus"> <el-form-item label="状态" prop="enabledStatus">
<el-select <el-select
v-model="queryParams.enabledStatus" v-model="queryParams.enabledStatus"
placeholder="请选择状态(1启用 2 未启用)" placeholder="请选择状态"
clearable clearable
class="!w-240px" class="!w-240px"
> >
@ -39,65 +45,55 @@
type="primary" type="primary"
plain plain
@click="openForm('create')" @click="openForm('create')"
v-hasPermi="['biz:store-house:create']"
> >
<Icon icon="ep:plus" class="mr-5px" /> 新增 <Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button> </el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['biz:store-house:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</ContentWrap> </ContentWrap>
<!-- 列表 --> <!-- 列表 -->
<ContentWrap> <ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true"> <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" border>
<el-table-column label="自增字段" align="center" prop="id" /> <el-table-column type="index" label="序号" align="center" min-width="60" />
<el-table-column <el-table-column label="仓库类型" align="center" prop="storeType">
label="创建时间" <template #default="scope">
align="center" <dict-tag :type="DICT_TYPE.WAREHOUSE_TYPE" :value="scope.row.storeType" />
prop="createTime" </template>
:formatter="dateFormatter" </el-table-column>
width="180px"
/>
<el-table-column label="仓储编码" align="center" prop="storeHouseCd" /> <el-table-column label="仓储编码" align="center" prop="storeHouseCd" />
<el-table-column label="仓储名称" align="center" prop="storeHouseName" /> <el-table-column label="仓储名称" align="center" prop="storeHouseName" />
<el-table-column label="状态(1启用 2 未启用)" align="center" prop="enabledStatus"> <el-table-column label="状态" align="center" prop="enabledStatus">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.SYSTEM_STATUS" :value="scope.row.enabledStatus" /> <dict-tag :type="DICT_TYPE.SYSTEM_STATUS" :value="scope.row.enabledStatus" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="备注" align="center" prop="remark" /> <el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="仓库类型(1 原料库 2 在制品库 3 成品库)" align="center" prop="storeType"> <el-table-column
<template #default="scope"> label="创建时间"
<dict-tag :type="DICT_TYPE.WAREHOUSE_TYPE" :value="scope.row.storeType" /> align="center"
</template> prop="createTime"
</el-table-column> :formatter="dateFormatter2"
width="180px"
/>
<el-table-column label="操作" align="center"> <el-table-column label="操作" align="center">
<template #default="scope"> <template #default="scope">
<el-button <el-button
link link
type="primary" type="primary"
@click="openForm('update', scope.row.id)" @click="openForm('update', scope.row.id)"
v-hasPermi="['biz:store-house:update']"
> >
编辑 编辑
</el-button> </el-button>
<el-button <!-- <el-button-->
link <!-- link-->
type="danger" <!-- type="danger"-->
@click="handleDelete(scope.row.id)" <!-- @click="handleDelete(scope.row.id)"-->
v-hasPermi="['biz:store-house:delete']" <!-- v-hasPermi="['biz:store-house:delete']"-->
> <!-- >-->
删除 <!-- 删除-->
</el-button> <!-- </el-button>-->
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -116,8 +112,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict' import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime' import { dateFormatter2} from '@/utils/formatTime'
import download from '@/utils/download'
import * as StoreHouseApi from '@/api/biz/storehouse' import * as StoreHouseApi from '@/api/biz/storehouse'
import StoreHouseForm from './StoreHouseForm.vue' import StoreHouseForm from './StoreHouseForm.vue'
@ -126,17 +121,17 @@ defineOptions({ name: 'StoreHouse' })
const message = useMessage() // const message = useMessage() //
const { t } = useI18n() // const { t } = useI18n() //
const loading = ref(true) // const loading = ref(false) //
const list = ref([]) // const list = ref([]) //
const total = ref(0) // const total = ref(0) //
const queryParams = reactive({ const queryParams = reactive({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
storeHouseName: undefined, storeType: undefined,
enabledStatus: undefined, enabledStatus: undefined,
}) })
const queryFormRef = ref() // const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */ /** 查询列表 */
const getList = async () => { const getList = async () => {
@ -181,23 +176,10 @@ const handleDelete = async (id: number) => {
} catch {} } catch {}
} }
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await StoreHouseApi.exportStoreHouse(queryParams)
download.excel(data, '仓储主数据.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/ /** 初始化 **/
onMounted(() => { onMounted(() => {
getList() // getList()
}) })
</script> </script>

View File

@ -1,57 +1,91 @@
<template> <template>
<Dialog :title="dialogTitle" v-model="dialogVisible"> <Dialog :title="dialogTitle" v-model="dialogVisible" width="1200" @close="cancel">
<el-form <el-form
ref="formRef" ref="formRef"
:model="formData" :model="formData"
:rules="formRules" :rules="formRules"
label-width="100px" label-width="100px"
v-loading="formLoading" v-loading="formLoading"
> >
<el-form-item label="工艺流程" prop="techProc"> <el-form-item label="工艺流程" prop="techProc">
<el-input v-model="formData.techProc" placeholder="请输入工艺流程" /> <el-input v-model="techProcDisplay" placeholder="请输入工艺流程" />
</el-form-item> </el-form-item>
<el-form-item label="状态(1启用 2 未启用)" prop="enabledStatus"> <el-form-item label="状态" prop="enabledStatus">
<el-radio-group v-model="formData.enabledStatus"> <el-select v-model="formData.enabledStatus" placeholder="请选择状态">
<el-radio <el-option
v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_STATUS)" v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_STATUS)"
:key="dict.value" :key="dict.value"
:label="dict.value" :label="dict.label"
> :value="dict.value"
{{ dict.label }} />
</el-radio> </el-select>
</el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" /> <el-input type="textarea" :rows="4" v-model="formData.remark" placeholder="请输入备注" />
</el-form-item> </el-form-item>
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">工序信息</span>
</template>
<el-row>
<el-col>
<el-card class="hl-incard">
<el-form ref="OrderYsDetailSubFormRef" :model="procList" label-width="0" >
<el-table ref="procTable" :data="procList" class="hl-table" @selection-change="handleProcSelectionChange" border>
<el-table-column type="selection" width="55"/>
<el-table-column prop="procCd" label="工序编码" align="center"/>
<el-table-column prop="procName" label="工序名称" align="center"/>
<el-table-column prop="remark" label="备注" align="center"/>
<el-table-column prop="creatorName" label="创建人" align="center"/>
<el-table-column prop="createTime" label="创建时间" align="center" :formatter="dateFormatter2"/>
</el-table>
</el-form>
</el-card>
</el-col>
</el-row>
</el-card>
</el-form> </el-form>
<template #footer> <template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button> <el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button> <el-button @click="cancel"> </el-button>
</template> </template>
</Dialog> </Dialog>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict' import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import * as TechProcApi from '@/api/biz/techproc' import * as TechProcApi from '@/api/biz/techproc'
import { dateFormatter2 } from '@/utils/formatTime'
import * as ProcApi from '@/api/biz/proc'
import { nextTick } from 'vue'
const { t } = useI18n() // const { t } = useI18n() //
const message = useMessage() // const message = useMessage() //
const procList = ref<ProcApi.ProcVO[]>([])
const dialogVisible = ref(false) // const dialogVisible = ref(false) //
const dialogTitle = ref('') // const dialogTitle = ref('') //
const formLoading = ref(false) // 12 const formLoading = ref(false)
const formType = ref('') // create - update - const formType = ref('') // create - update -
const formData = ref({ const formData = ref({
id: undefined, id: undefined as number | undefined,
techProc: undefined, techProc: undefined as string | undefined,
enabledStatus: undefined, enabledStatus: 0 as number,
remark: undefined, remark: undefined as string | undefined,
procList: undefined as string[] | undefined,
}) })
const formRules = reactive({ const formRules = reactive({
techProc: [{ required: true, message: '工艺流程不能为空', trigger: 'blur' }],
enabledStatus: [{ required: true, message: '状态不能为空', trigger: 'change' }]
}) })
const formRef = ref() // Ref const formRef = ref() // Ref
const procTable = ref() // Ref
const selectedProcs = ref<ProcApi.ProcVO[]>([]) //
const techProcDisplay = ref('') //
const PROC_SEPARATOR = '-'
/** 打开弹窗 */ /** 打开弹窗 */
const open = async (type: string, id?: number) => { const open = async (type: string, id?: number) => {
dialogVisible.value = true dialogVisible.value = true
@ -59,17 +93,81 @@ const open = async (type: string, id?: number) => {
formType.value = type formType.value = type
resetForm() resetForm()
// //
procList.value=await ProcApi.getProcList()
if (id) { if (id) {
formLoading.value = true formLoading.value = true
try { try {
formData.value = await TechProcApi.getTechProc(id) formData.value = await TechProcApi.getTechProc(id)
//
techProcDisplay.value = convertCodeToName(formData.value.techProc)
//
setSelectedRows(formData.value.techProc)
} finally { } finally {
formLoading.value = false formLoading.value = false
} }
} }
}
defineExpose({ open }) // open
}
defineExpose({ open }) // opensetSelectedRows
const cancel = async () => {
dialogVisible.value = false
emit('success')
}
/** 工序编码转名称 */
const convertCodeToName = (codeStr: string | undefined) => {
if (!codeStr) {
return ''
}
const codes = codeStr.split(PROC_SEPARATOR)
const names = codes.map(code => {
const proc = procList.value.find(item => item.procCd === code)
return proc ? proc.procName : code
})
return names.join(PROC_SEPARATOR)
}
/** 工序选择变化处理 - 按列表顺序排列 */
const handleProcSelectionChange = (rows: ProcApi.ProcVO[]) => {
selectedProcs.value = rows
//
const selectedCodes = new Set(rows.map(item => item.procCd))
//
const sortedSelected = procList.value.filter(item => selectedCodes.has(item.procCd))
//
techProcDisplay.value = sortedSelected.map(item => item.procName).join(PROC_SEPARATOR)
//
formData.value.techProc = sortedSelected.map(item => item.procCd).join(PROC_SEPARATOR)
//
formData.value.procList = sortedSelected.map(item => item.procCd)
}
/** 设置表格选中行 */
const setSelectedRows = (procCodes) => {
if (!procCodes || !procTable.value || procList.value.length === 0) {
return
}
let codes: string[] = []
if (Array.isArray(procCodes)) {
if (procCodes.length > 0 && typeof procCodes[0] === 'object') {
codes = procCodes.map((item: any) => item.procCd || item.id || item)
} else {
codes = procCodes
}
} else if (typeof procCodes === 'string') {
codes = procCodes.split(PROC_SEPARATOR)
}
procTable.value.clearSelection()
if (codes.length > 0) {
const codeSet = new Set(codes.map(c => String(c)))
const rows = procList.value.filter(item => codeSet.has(String(item.procCd)))
selectedProcs.value = rows
nextTick(() => {
rows.forEach(row => {
procTable.value.toggleRowSelection(row, true)
})
})
}
}
/** 提交表单 */ /** 提交表单 */
const emit = defineEmits(['success']) // success const emit = defineEmits(['success']) // success
const submitForm = async () => { const submitForm = async () => {
@ -99,9 +197,11 @@ const resetForm = () => {
formData.value = { formData.value = {
id: undefined, id: undefined,
techProc: undefined, techProc: undefined,
enabledStatus: undefined, enabledStatus: 0,
remark: undefined, remark: undefined,
procList: undefined,
} }
techProcDisplay.value = ''
formRef.value?.resetFields() formRef.value?.resetFields()
} }
</script> </script>

View File

@ -8,10 +8,10 @@
:inline="true" :inline="true"
label-width="68px" label-width="68px"
> >
<el-form-item label="状态(1启用 2 未启用)" prop="enabledStatus"> <el-form-item label="状态" prop="enabledStatus">
<el-select <el-select
v-model="queryParams.enabledStatus" v-model="queryParams.enabledStatus"
placeholder="请选择状态(1启用 2 未启用)" placeholder="请选择状态"
clearable clearable
class="!w-240px" class="!w-240px"
> >
@ -34,55 +34,44 @@
> >
<Icon icon="ep:plus" class="mr-5px" /> 新增 <Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button> </el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['biz:tech-proc:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</ContentWrap> </ContentWrap>
<!-- 列表 --> <!-- 列表 -->
<ContentWrap> <ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true"> <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" border>
<el-table-column label="自增字段" align="center" prop="id" /> <el-table-column type="index" label="序号" align="center" min-width="60" />
<el-table-column <el-table-column label="工艺流程" align="center" prop="techProcDisplay" width="300px"/>
label="创建时间" <el-table-column label="状态" align="center" prop="enabledStatus" width="100px">
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="工艺流程" align="center" prop="techProc" />
<el-table-column label="状态(1启用 2 未启用)" align="center" prop="enabledStatus">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.SYSTEM_STATUS" :value="scope.row.enabledStatus" /> <dict-tag :type="DICT_TYPE.SYSTEM_STATUS" :value="scope.row.enabledStatus" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="备注" align="center" prop="remark" /> <el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center"> <el-table-column
label="创建人"
align="center"
prop="nickname"
width="100px"
/>
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter2" width="120px"
/>
<el-table-column label="操作" align="center" width="100px">
<template #default="scope"> <template #default="scope">
<el-button <el-button
link link
type="primary" type="primary"
@click="openForm('update', scope.row.id)" @click="openForm('update', scope.row.id)"
v-hasPermi="['biz:tech-proc:update']"
> >
编辑 编辑
</el-button> </el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['biz:tech-proc:delete']"
>
删除
</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -101,18 +90,21 @@
<script setup lang="ts"> <script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict' import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime' import { dateFormatter2} from '@/utils/formatTime'
import download from '@/utils/download'
import * as TechProcApi from '@/api/biz/techproc' import * as TechProcApi from '@/api/biz/techproc'
import TechProcForm from './TechProcForm.vue' import TechProcForm from './TechProcForm.vue'
import * as ProcApi from "@/api/biz/proc";
interface TechProcVOWithDisplay extends TechProcApi.TechProcVO {
techProcDisplay?: string
}
defineOptions({ name: 'TechProc' }) defineOptions({ name: 'TechProc' })
const message = useMessage() // const procList = ref<ProcApi.ProcVO[]>([])
const { t } = useI18n() //
const loading = ref(true) // const loading = ref(false) //
const list = ref([]) // const list = ref<TechProcVOWithDisplay[]>([]) //
const total = ref(0) // const total = ref(0) //
const queryParams = reactive({ const queryParams = reactive({
pageNo: 1, pageNo: 1,
@ -120,7 +112,7 @@ const queryParams = reactive({
enabledStatus: undefined, enabledStatus: undefined,
}) })
const queryFormRef = ref() // const queryFormRef = ref() //
const exportLoading = ref(false) // const PROC_SEPARATOR = '-'
/** 查询列表 */ /** 查询列表 */
const getList = async () => { const getList = async () => {
@ -128,12 +120,26 @@ const getList = async () => {
try { try {
const data = await TechProcApi.getTechProcPage(queryParams) const data = await TechProcApi.getTechProcPage(queryParams)
list.value = data.list list.value = data.list
list.value.forEach(item=>{
item.techProcDisplay=convertCodeToName(item.techProc)
})
total.value = data.total total.value = data.total
} finally { } finally {
loading.value = false loading.value = false
} }
} }
/** 工序编码转名称 */
const convertCodeToName = (codeStr: string | undefined) => {
if (!codeStr) {
return ''
}
const codes = codeStr.split(PROC_SEPARATOR)
const names = codes.map(code => {
const proc = procList.value.find(item => item.procCd === code)
return proc ? proc.procName : code
})
return names.join(PROC_SEPARATOR)
}
/** 搜索按钮操作 */ /** 搜索按钮操作 */
const handleQuery = () => { const handleQuery = () => {
queryParams.pageNo = 1 queryParams.pageNo = 1
@ -152,36 +158,13 @@ const openForm = (type: string, id?: number) => {
formRef.value.open(type, id) formRef.value.open(type, id)
} }
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await TechProcApi.deleteTechProc(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await TechProcApi.exportTechProc(queryParams)
download.excel(data, '工艺流程主数据.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/ /** 初始化 **/
onMounted(() => { onMounted(async () => {
getList() // getList()
procList.value=await ProcApi.getProcList()
}) })
</script> </script>