feat: 1.新增物料、物料类型、材料检验统计等表维护功能 2.完善判定依据-判断依据明细 3.新增判断依据、物料管理等字典翻译类 4.成品物料批次-原始数据维护页面
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.dromara.common.core.service; |
| | | |
| | | /** |
| | | * å¤å®ä¾æ® |
| | | */ |
| | | public interface JudgeService { |
| | | /** |
| | | * å¤å®ä¾æ®code转name |
| | | * @param judgeCode |
| | | * @return |
| | | */ |
| | | String selectJudgeNameByCode(String judgeCode); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.dromara.common.core.service; |
| | | |
| | | /** |
| | | * ç©æ |
| | | */ |
| | | public interface MatService { |
| | | /** |
| | | * ç©æcode转name |
| | | * @param matCode |
| | | * @return |
| | | */ |
| | | String selectMatNameByCode(String matCode); |
| | | } |
| | |
| | | */ |
| | | String OSS_ID_TO_URL = "oss_id_to_url"; |
| | | |
| | | |
| | | /** |
| | | * ç©æcode转name |
| | | */ |
| | | String MAT_CODE_TO_NAME = "mat_code_to_name"; |
| | | |
| | | /** |
| | | * å¤å®ä¾æ®code转name |
| | | */ |
| | | String JUDGE_CODE_TO_NAME = "judge_code_to_name"; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.dromara.common.translation.core.impl; |
| | | |
| | | import lombok.AllArgsConstructor; |
| | | import org.dromara.common.core.service.JudgeService; |
| | | import org.dromara.common.core.service.MatService; |
| | | import org.dromara.common.translation.annotation.TranslationType; |
| | | import org.dromara.common.translation.constant.TransConstant; |
| | | import org.dromara.common.translation.core.TranslationInterface; |
| | | |
| | | /** |
| | | * judgeNameç¿»è¯å®ç° |
| | | * |
| | | * @author zhuguifei |
| | | */ |
| | | @AllArgsConstructor |
| | | @TranslationType(type = TransConstant.JUDGE_CODE_TO_NAME) |
| | | public class JudgeNameTranslationImpl implements TranslationInterface<String> { |
| | | |
| | | private final JudgeService judgeService; |
| | | |
| | | @Override |
| | | public String translation(Object key, String other) { |
| | | if(key == null) return ""; |
| | | return judgeService.selectJudgeNameByCode(key.toString()); |
| | | } |
| | | } |
| | |
| | | org.dromara.common.translation.core.impl.OssUrlTranslationImpl |
| | | org.dromara.common.translation.core.impl.UserNameTranslationImpl |
| | | org.dromara.common.translation.core.impl.NicknameTranslationImpl |
| | | org.dromara.common.translation.core.impl.MatNameTranslationImpl |
| | | org.dromara.common.translation.core.impl.JudgeNameTranslationImpl |
| | |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢å¤å®æ¨¡æ¿æç»æ å½¢ç»æå表 |
| | | */ |
| | | @SaCheckPermission("qm:judgeDetails:list") |
| | | @GetMapping("/tree") |
| | | public TableDataInfo<QmJudgeDetailsVo> tree(@RequestParam @NotBlank(message = "judgeIdä¸è½ä¸ºç©º") String judgeId) { |
| | | List<QmJudgeDetailsVo> list = qmJudgeDetailsService.queryTreeListByJudgeId(judgeId); |
| | | return TableDataInfo.build(list); |
| | | } |
| | | |
| | | /** |
| | | * 导åºå¤å®æ¨¡æ¿æç»å表 |
| | | */ |
| | | @SaCheckPermission("qm:judgeDetails:export") |
| | |
| | | /** |
| | | * æ åå¼ |
| | | */ |
| | | private Long value3; |
| | | private Double value3; |
| | | |
| | | /** |
| | | * å¤å®å¼1 |
| | | */ |
| | | private Long value1; |
| | | private Double value1; |
| | | |
| | | /** |
| | | * å¤å®å¼2 |
| | | */ |
| | | private Long value2; |
| | | private Double value2; |
| | | |
| | | /** |
| | | * 缺é·ä½ç½® |
| | |
| | | /** |
| | | * å弿 å (æ£åæ åï¼å¾åæ å),æ¯å¦ä¸åæ ¼ä¸æ¬¡æ£å¤å°å |
| | | */ |
| | | private Long stdscore; |
| | | private Double stdscore; |
| | | |
| | | /** |
| | | * æ è®°æ¤é¡¹æ¯å¦ä¸ºåæé¡¹ç®ï¼æ¯å¦å¤è§ï¼å®é
ä¸å
³èäºå¾å¤åé¡¹ç® |
| | |
| | | /** |
| | | * æ åå¼ |
| | | */ |
| | | private Long value3; |
| | | private Double value3; |
| | | |
| | | /** |
| | | * å¤å®å¼1 |
| | | */ |
| | | private Long value1; |
| | | private Double value1; |
| | | |
| | | /** |
| | | * å¤å®å¼2 |
| | | */ |
| | | private Long value2; |
| | | private Double value2; |
| | | |
| | | /** |
| | | * 缺é·ä½ç½® |
| | |
| | | /** |
| | | * å弿 å (æ£åæ åï¼å¾åæ å),æ¯å¦ä¸åæ ¼ä¸æ¬¡æ£å¤å°å |
| | | */ |
| | | private Long stdscore; |
| | | private Double stdscore; |
| | | |
| | | /** |
| | | * æ è®°æ¤é¡¹æ¯å¦ä¸ºåæé¡¹ç®ï¼æ¯å¦å¤è§ï¼å®é
ä¸å
³èäºå¾å¤åé¡¹ç® |
| | |
| | | |
| | | import java.util.Date; |
| | | |
| | | import org.dromara.common.translation.annotation.Translation; |
| | | import org.dromara.common.translation.constant.TransConstant; |
| | | import org.dromara.qa.qm.domain.QmBatch; |
| | | import cn.idev.excel.annotation.ExcelIgnoreUnannotated; |
| | | import cn.idev.excel.annotation.ExcelProperty; |
| | |
| | | /** |
| | | * çå· |
| | | */ |
| | | @ExcelProperty(value = "çå·") |
| | | @ExcelProperty(value = "çå·code") |
| | | private String matCode; |
| | | |
| | | /** |
| | | * çå· |
| | | */ |
| | | @ExcelProperty(value = "çå·") |
| | | @Translation(type = TransConstant.MAT_CODE_TO_NAME, mapper = "matCode") |
| | | private String matName; |
| | | |
| | | /** |
| | | * å¤å®ä¾æ®ä»£ç |
| | |
| | | @ExcelProperty(value = "å¤å®ä¾æ®ä»£ç ") |
| | | private String judgeCode; |
| | | |
| | | @ExcelProperty(value = "å¤å®ä¾æ®") |
| | | @Translation(type = TransConstant.JUDGE_CODE_TO_NAME, mapper = "judgeCode") |
| | | private String judgeName; |
| | | |
| | | /** |
| | | * æ¹æ¬¡çææ¥æ |
| | | */ |
| | |
| | | import java.io.Serial; |
| | | import java.io.Serializable; |
| | | import java.util.Date; |
| | | |
| | | import java.util.List; |
| | | |
| | | |
| | | /** |
| | |
| | | |
| | | @Serial |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | private String id; |
| | | |
| | | /** |
| | | * å¤å®ä¸»æ è¯ |
| | |
| | | * æ åå¼ |
| | | */ |
| | | @ExcelProperty(value = "æ åå¼") |
| | | private Long value3; |
| | | private Double value3; |
| | | |
| | | /** |
| | | * å¤å®å¼1 |
| | | */ |
| | | @ExcelProperty(value = "å¤å®å¼1") |
| | | private Long value1; |
| | | private Double value1; |
| | | |
| | | /** |
| | | * å¤å®å¼2 |
| | | */ |
| | | @ExcelProperty(value = "å¤å®å¼2") |
| | | private Long value2; |
| | | private Double value2; |
| | | |
| | | /** |
| | | * 缺é·ä½ç½® |
| | |
| | | * å弿 å (æ£åæ åï¼å¾åæ å),æ¯å¦ä¸åæ ¼ä¸æ¬¡æ£å¤å°å |
| | | */ |
| | | @ExcelProperty(value = "å弿 å (æ£åæ åï¼å¾åæ å),æ¯å¦ä¸åæ ¼ä¸æ¬¡æ£å¤å°å") |
| | | private Long stdscore; |
| | | private Double stdscore; |
| | | |
| | | /** |
| | | * æ è®°æ¤é¡¹æ¯å¦ä¸ºåæé¡¹ç®ï¼æ¯å¦å¤è§ï¼å®é
ä¸å
³èäºå¾å¤åé¡¹ç® |
| | |
| | | private String updateUser; |
| | | |
| | | |
| | | /** |
| | | * åæ¹æ¬¡ç |
| | | */ |
| | | @ExcelProperty(value = "åæ¹æ¬¡ç ") |
| | | private String subBatchCode; |
| | | |
| | | /** |
| | | * ä¸è¯å¼ |
| | | */ |
| | | @ExcelProperty(value = "ä¸è¯å¼") |
| | | private Long badVal; |
| | | |
| | | /** |
| | | * æ¹æ¬¡ç |
| | | */ |
| | | @ExcelProperty(value = "æ¹æ¬¡ç ") |
| | | private String batchCode; |
| | | |
| | | /** |
| | | * ç©æç |
| | | */ |
| | | @ExcelProperty(value = "ç©æç ") |
| | | private String matCode; |
| | | |
| | | /** |
| | | * è®¾å¤ |
| | | */ |
| | | @ExcelProperty(value = "设å¤") |
| | | private String eqp; |
| | | |
| | | /** |
| | | * æ´æ°æ¶é´ |
| | | */ |
| | | @ExcelProperty(value = "æ´æ°æ¶é´") |
| | | private Date updateTime; |
| | | |
| | | /** |
| | | * å项å表ï¼ç¨äºæ å½¢ç»æï¼ |
| | | */ |
| | | private List<QmJudgeDetailsVo> children; |
| | | |
| | | |
| | | } |
| | |
| | | * ç©æçå· |
| | | */ |
| | | @ExcelProperty(value = "ç©æçå·") |
| | | @Translation(type = TransConstant.MAT_CODE_TO_NAME, mapper = "matCode") |
| | | private String matName; |
| | | |
| | | /** |
| | |
| | | List<QmJudgeDetailsVo> queryList(QmJudgeDetailsBo bo); |
| | | |
| | | /** |
| | | * æ¥è¯¢æ å½¢ç»ææ°æ® |
| | | * |
| | | * @param judgeId å¤å®ä¸»æ è¯ |
| | | * @return æ å½¢ç»æå表 |
| | | */ |
| | | List<QmJudgeDetailsVo> queryTreeListByJudgeId(String judgeId); |
| | | |
| | | /** |
| | | * æ°å¢å¤å®æ¨¡æ¿æç» |
| | | * |
| | | * @param bo å¤å®æ¨¡æ¿æç» |
| | |
| | | return baseMapper.selectVoList(lqw); |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢æ å½¢ç»ææ°æ® |
| | | * |
| | | * @param judgeId å¤å®ä¸»æ è¯ |
| | | * @return æ å½¢ç»æå表 |
| | | */ |
| | | @Override |
| | | public List<QmJudgeDetailsVo> queryTreeListByJudgeId(String judgeId) { |
| | | if (StringUtils.isBlank(judgeId)) { |
| | | return new java.util.ArrayList<>(); |
| | | } |
| | | // 1. æ¥è¯¢æ ¹èç¹ (rid is null) |
| | | List<QmJudgeDetailsVo> roots = selectTreeNodes(judgeId, null); |
| | | for (QmJudgeDetailsVo root : roots) { |
| | | // 2. æ¥è¯¢ç¬¬ä¸çº§åèç¹ (rid = root.itemCod) |
| | | List<QmJudgeDetailsVo> children = selectTreeNodes(judgeId, root.getItemCod()); |
| | | for (QmJudgeDetailsVo child : children) { |
| | | // 3. æ¥è¯¢ç¬¬äºçº§åèç¹ (rid = child.itemCod) |
| | | List<QmJudgeDetailsVo> grandchildren = selectTreeNodes(judgeId, child.getItemCod()); |
| | | child.setChildren(grandchildren); |
| | | } |
| | | root.setChildren(children); |
| | | } |
| | | return roots; |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢æ èç¹ |
| | | * |
| | | * @param judgeId å¤å®ä¸»æ è¯ |
| | | * @param rid å
³è项ID |
| | | * @return èç¹å表 |
| | | */ |
| | | private List<QmJudgeDetailsVo> selectTreeNodes(String judgeId, String rid) { |
| | | LambdaQueryWrapper<QmJudgeDetails> lqw = Wrappers.lambdaQuery(); |
| | | lqw.eq(QmJudgeDetails::getJudgeId, judgeId); |
| | | if (rid == null) { |
| | | lqw.isNull(QmJudgeDetails::getRid); |
| | | } else { |
| | | lqw.eq(QmJudgeDetails::getRid, rid); |
| | | } |
| | | lqw.orderByAsc(QmJudgeDetails::getId); |
| | | return baseMapper.selectVoList(lqw); |
| | | } |
| | | |
| | | private LambdaQueryWrapper<QmJudgeDetails> buildQueryWrapper(QmJudgeDetailsBo bo) { |
| | | Map<String, Object> params = bo.getParams(); |
| | | LambdaQueryWrapper<QmJudgeDetails> lqw = Wrappers.lambdaQuery(); |
| | |
| | | package org.dromara.qa.qm.service.impl; |
| | | |
| | | import org.dromara.common.core.service.JudgeService; |
| | | import org.dromara.common.core.utils.MapstructUtils; |
| | | import org.dromara.common.core.utils.StringUtils; |
| | | import org.dromara.common.mybatis.core.page.TableDataInfo; |
| | |
| | | import org.dromara.qa.qm.service.IQmStdService; |
| | | import org.dromara.qa.qm.mapper.QmStdMapper; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import org.dromara.qa.qm.domain.QmCheckitem; |
| | | import org.dromara.qa.qm.domain.QmJudgeDetails; |
| | | import org.dromara.qa.qm.mapper.QmCheckitemMapper; |
| | | import org.dromara.qa.qm.mapper.QmJudgeDetailsMapper; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Collection; |
| | |
| | | @Slf4j |
| | | @RequiredArgsConstructor |
| | | @Service |
| | | public class QmJudgeServiceImpl implements IQmJudgeService { |
| | | public class QmJudgeServiceImpl implements IQmJudgeService, JudgeService { |
| | | |
| | | private final QmJudgeMapper baseMapper; |
| | | private final QmStdMapper qmStdMapper; |
| | | private final QmCheckitemMapper qmCheckitemMapper; |
| | | private final QmJudgeDetailsMapper qmJudgeDetailsMapper; |
| | | |
| | | /** |
| | | * æ¥è¯¢å¤å®ä¾æ® |
| | |
| | | * @return æ¯å¦æ°å¢æå |
| | | */ |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Boolean insertByBo(QmJudgeBo bo) { |
| | | QmJudge add = MapstructUtils.convert(bo, QmJudge.class); |
| | | if (add.getCdate() == null) { |
| | | add.setCdate(new java.util.Date()); |
| | | } |
| | | validEntityBeforeSave(add); |
| | | boolean flag = baseMapper.insert(add) > 0; |
| | | if (flag) { |
| | | bo.setId(add.getId()); |
| | | |
| | | // 1. æ ¹æ® stdCod æ¥è¯¢å¯ç¨çè§ç¨æ£éªé¡¹ç® |
| | | LambdaQueryWrapper<QmCheckitem> itemLqw = Wrappers.lambdaQuery(); |
| | | itemLqw.eq(QmCheckitem::getStdCode, bo.getStdCod()); |
| | | itemLqw.eq(QmCheckitem::getEnable, 1L); |
| | | itemLqw.ne(QmCheckitem::getDel, 1L); |
| | | List<QmCheckitem> checkitems = qmCheckitemMapper.selectList(itemLqw); |
| | | |
| | | if (!checkitems.isEmpty()) { |
| | | List<QmJudgeDetails> detailsList = checkitems.stream().map(item -> { |
| | | QmJudgeDetails detail = new QmJudgeDetails(); |
| | | detail.setJudgeId(add.getId()); |
| | | detail.setItemCod(item.getId()); |
| | | detail.setItemName(item.getItemName()); |
| | | detail.setValue3(0.0); |
| | | detail.setValue1(0.0); |
| | | detail.setValue2(0.0); |
| | | detail.setLocation(item.getLocation()); |
| | | detail.setCls(item.getCheckLevel()); |
| | | detail.setStdscore(item.getScore() != null ? item.getScore() : 0.0); |
| | | detail.setIsmix(item.getIsmix() != null ? item.getIsmix() : 0L); |
| | | detail.setRid(item.getRid()); |
| | | detail.setCategory(item.getCategory()); |
| | | detail.setDecisionDes(item.getItemDes()); |
| | | return detail; |
| | | }).collect(Collectors.toList()); |
| | | qmJudgeDetailsMapper.insertBatch(detailsList); |
| | | } |
| | | |
| | | // 2. å°åæ¥åå¨çç¸åç©æçå·åç±»åç便®è®¾ç½®ä¸ºç¦ç¨ |
| | | LambdaUpdateWrapper<QmJudge> updateWrapper = Wrappers.lambdaUpdate(); |
| | | updateWrapper.set(QmJudge::getStatus, 0L) |
| | | .eq(QmJudge::getMatCode, bo.getMatCode()) |
| | | .eq(QmJudge::getCategory, bo.getCategory()) |
| | | .ne(QmJudge::getId, add.getId()); |
| | | baseMapper.update(null, updateWrapper); |
| | | } |
| | | return flag; |
| | | } |
| | |
| | | } |
| | | return baseMapper.deleteByIds(ids) > 0; |
| | | } |
| | | |
| | | @Override |
| | | public String selectJudgeNameByCode(String judgeCode) { |
| | | QmJudgeVo qmJudgeVo = baseMapper.selectVoById(judgeCode); |
| | | if(qmJudgeVo!=null){ |
| | | return qmJudgeVo.getJudgeName(); |
| | | } |
| | | return null; |
| | | } |
| | | } |
| | |
| | | demo_tree: () => import("@/views/demo/tree/index.vue"), |
| | | home: () => import("@/views/home/index.vue"), |
| | | md_instrument: () => import("@/views/md/instrument/index.vue"), |
| | | "md_mat-type": () => import("@/views/md/mat-type/index.vue"), |
| | | md_mat: () => import("@/views/md/mat/index.vue"), |
| | | md_shift: () => import("@/views/md/shift/index.vue"), |
| | | monitor_cache: () => import("@/views/monitor/cache/index.vue"), |
| | | monitor_logininfor: () => import("@/views/monitor/logininfor/index.vue"), |
| | |
| | | qm_batch: () => import("@/views/qm/batch/index.vue"), |
| | | "qm_judge-details": () => import("@/views/qm/judge-details/index.vue"), |
| | | qm_judge: () => import("@/views/qm/judge/index.vue"), |
| | | qm_matcheck: () => import("@/views/qm/matcheck/index.vue"), |
| | | qm_std: () => import("@/views/qm/std/index.vue"), |
| | | report_demo: () => import("@/views/report/demo/index.vue"), |
| | | "report_silk-storage-output": () => import("@/views/report/silk-storage-output/index.vue"), |
| | |
| | | } |
| | | }, |
| | | { |
| | | name: 'md_mat', |
| | | path: '/md/mat', |
| | | component: 'view.md_mat', |
| | | meta: { |
| | | title: 'md_mat', |
| | | i18nKey: 'route.md_mat' |
| | | } |
| | | }, |
| | | { |
| | | name: 'md_mat-type', |
| | | path: '/md/mat-type', |
| | | component: 'view.md_mat-type', |
| | | meta: { |
| | | title: 'md_mat-type', |
| | | i18nKey: 'route.md_mat-type' |
| | | } |
| | | }, |
| | | { |
| | | name: 'md_shift', |
| | | path: '/md/shift', |
| | | component: 'view.md_shift', |
| | |
| | | } |
| | | }, |
| | | { |
| | | name: 'qm_matcheck', |
| | | path: '/qm/matcheck', |
| | | component: 'view.qm_matcheck', |
| | | meta: { |
| | | title: 'qm_matcheck', |
| | | i18nKey: 'route.qm_matcheck' |
| | | } |
| | | }, |
| | | { |
| | | name: 'qm_std', |
| | | path: '/qm/std', |
| | | component: 'view.qm_std', |
| | |
| | | "login": "/login/:module(pwd-login|code-login|register|reset-pwd|bind-wechat)?", |
| | | "md": "/md", |
| | | "md_instrument": "/md/instrument", |
| | | "md_mat": "/md/mat", |
| | | "md_mat-type": "/md/mat-type", |
| | | "md_shift": "/md/shift", |
| | | "monitor": "/monitor", |
| | | "monitor_cache": "/monitor/cache", |
| | |
| | | "qm_batch": "/qm/batch", |
| | | "qm_judge": "/qm/judge", |
| | | "qm_judge-details": "/qm/judge-details", |
| | | "qm_matcheck": "/qm/matcheck", |
| | | "qm_std": "/qm/std", |
| | | "report": "/report", |
| | | "report_demo": "/report/demo", |
| | |
| | | params |
| | | }); |
| | | } |
| | | /** è·åå¤å®æ¨¡æ¿æç»æ å½¢å表 */ |
| | | export function fetchGetJudgeDetailsTree(params?: Api.Qm.JudgeDetailsSearchParams) { |
| | | return request<Api.Qm.JudgeDetailsList>({ |
| | | url: '/qm/judgeDetails/tree', |
| | | method: 'get', |
| | | params |
| | | }); |
| | | } |
| | | |
| | | |
| | | /** æ°å¢å¤å®æ¨¡æ¿æç» */ |
| | | export function fetchCreateJudgeDetails(data: Api.Qm.JudgeDetailsOperateParams) { |
| | | return request<boolean>({ |
| | |
| | | eqpCode: string; |
| | | /** çå· */ |
| | | matCode: string; |
| | | /** çå· */ |
| | | matName: string; |
| | | /** å¤å®ä¾æ®ä»£ç */ |
| | | judgeCode: string; |
| | | /** æ¹æ¬¡çææ¥æ */ |
| | |
| | | Pick< |
| | | Api.Qm.Batch, |
| | | | 'batchCode' |
| | | | 'isflag' |
| | | | 'typ' |
| | | | 'eqpCode' |
| | | | 'matCode' |
| | |
| | | | 'flag' |
| | | | 'toMesDate' |
| | | | 'fromMesDate' |
| | | | 'enabled' |
| | | | 'deleted' |
| | | | 'category' |
| | | | 'state' |
| | |
| | | id: CommonType.IdType; |
| | | /** å¤å®ä¸»æ è¯ */ |
| | | judgeId: CommonType.IdType; |
| | | /** å¤å®é¡¹ITEM */ |
| | | /** æ£éªé¡¹ç®ä»£ç */ |
| | | itemCode: string; |
| | | /** å¤å®é¡¹ITEM (å
¼å®¹æ§å段) */ |
| | | itemCod: string; |
| | | /** å¤å®é¡¹NAME */ |
| | | /** æ£éªé¡¹ç®åç§° */ |
| | | itemName: string; |
| | | /** åä½ */ |
| | | unit: string; |
| | | /** å¯ç¨ */ |
| | | enable: number; |
| | | /** å é¤ */ |
| | | del: number; |
| | | /** æ£éªé¡¹æè¿° */ |
| | | itemDes: string; |
| | | /** è§ç¨ä»£ç */ |
| | | stdCode: string; |
| | | /** ä»ªå¨æè¿° */ |
| | | instrumentDes: string; |
| | | /** æ åå¼ */ |
| | | value3: number; |
| | | /** å¤å®å¼1 */ |
| | | value1: number; |
| | | /** å¤å®å¼2 */ |
| | | value2: number; |
| | | /** 缺é·ä½ç½® */ |
| | | /** 缺é·ä½ç½®-å¤è§ç¨ */ |
| | | location: string; |
| | | /** å¤å®çº§å« (A,B,C,D) */ |
| | | /** åA,B,C,Dåä¸ªçº§å« */ |
| | | checkLevel: string; |
| | | /** å¤å®çº§å« (A,B,C,D) (å
¼å®¹æ§å段) */ |
| | | cls: string; |
| | | /** å弿 å (æ£åæ åï¼å¾åæ å),æ¯å¦ä¸åæ ¼ä¸æ¬¡æ£å¤å°å */ |
| | | /** åå¼ */ |
| | | score: number; |
| | | /** å弿 å (æ£åæ åï¼å¾åæ å) (å
¼å®¹æ§å段) */ |
| | | stdscore: number; |
| | | /** æ è®°æ¤é¡¹æ¯å¦ä¸ºåæé¡¹ç®ï¼æ¯å¦å¤è§ï¼å®é
ä¸å
³èäºå¾å¤åé¡¹ç® */ |
| | | /** æ¯å¦åæé¡¹ */ |
| | | ismix: number; |
| | | /** è¥æ¤å段æUUIDå¼ï¼è¡¨æå®å¯è½ä¸ºå
¶ä»é¡¹ç®çåé¡¹ï¼æ¯å¦â空头â,å®ä¸ºçæ¯å¤è§é¡¹ç®çå项 */ |
| | | /** å
³è项ID */ |
| | | rid: CommonType.IdType; |
| | | /** èå´-å¤ç¨ */ |
| | | /** ç±»å« 0:æå 1è¾
æ */ |
| | | category: number; |
| | | /** 夿³¨ */ |
| | | /** 仪å¨ç¼ç */ |
| | | instrumentCode: string; |
| | | /** 夿³¨ (å
¼å®¹æ§å段) */ |
| | | decisionDes: string; |
| | | /** ä¿®æ¹äºº */ |
| | | updateUser: string; |
| | | /** åèç¹ */ |
| | | children?: Api.Qm.JudgeDetails[]; |
| | | }>; |
| | | |
| | | /** judge details search params */ |
| | |
| | | "login": "/login/:module(pwd-login|code-login|register|reset-pwd|bind-wechat)?"; |
| | | "md": "/md"; |
| | | "md_instrument": "/md/instrument"; |
| | | "md_mat": "/md/mat"; |
| | | "md_mat-type": "/md/mat-type"; |
| | | "md_shift": "/md/shift"; |
| | | "monitor": "/monitor"; |
| | | "monitor_cache": "/monitor/cache"; |
| | |
| | | "qm_batch": "/qm/batch"; |
| | | "qm_judge": "/qm/judge"; |
| | | "qm_judge-details": "/qm/judge-details"; |
| | | "qm_matcheck": "/qm/matcheck"; |
| | | "qm_std": "/qm/std"; |
| | | "report": "/report"; |
| | | "report_demo": "/report/demo"; |
| | |
| | | | "demo_tree" |
| | | | "home" |
| | | | "md_instrument" |
| | | | "md_mat-type" |
| | | | "md_mat" |
| | | | "md_shift" |
| | | | "monitor_cache" |
| | | | "monitor_logininfor" |
| | |
| | | | "qm_batch" |
| | | | "qm_judge-details" |
| | | | "qm_judge" |
| | | | "qm_matcheck" |
| | | | "qm_std" |
| | | | "report_demo" |
| | | | "report_silk-storage-output" |
| | |
| | | <script setup lang="tsx"> |
| | | import { ref } from 'vue'; |
| | | import { NDivider } from 'naive-ui'; |
| | | import { fetchBatchDeleteBatch, fetchGetBatchList } from '@/service/api/qm/batch'; |
| | | import { useAppStore } from '@/store/modules/app'; |
| | | import { useAuth } from '@/hooks/business/auth'; |
| | | import { useDownload } from '@/hooks/business/download'; |
| | | import { defaultTransform, useNaivePaginatedTable, useTableOperate } from '@/hooks/common/table'; |
| | | import { $t } from '@/locales'; |
| | | import {nextTick, ref} from 'vue'; |
| | | import {useRouter} from 'vue-router'; |
| | | import {NDivider, NDropdown} from 'naive-ui'; |
| | | import {fetchBatchDeleteBatch, fetchGetBatchList} from '@/service/api/qm/batch'; |
| | | import {useAppStore} from '@/store/modules/app'; |
| | | import {useAuth} from '@/hooks/business/auth'; |
| | | import {useDownload} from '@/hooks/business/download'; |
| | | import {useSvgIcon} from '@/hooks/common/icon'; |
| | | import {defaultTransform, useNaivePaginatedTable, useTableOperate} from '@/hooks/common/table'; |
| | | import {$t} from '@/locales'; |
| | | import ButtonIcon from '@/components/custom/button-icon.vue'; |
| | | import BatchOperateDrawer from './modules/batch-operate-drawer.vue'; |
| | | import BatchSearch from './modules/batch-search.vue'; |
| | |
| | | }); |
| | | |
| | | const appStore = useAppStore(); |
| | | const { download } = useDownload(); |
| | | const { hasAuth } = useAuth(); |
| | | const router = useRouter(); |
| | | const {download} = useDownload(); |
| | | const {hasAuth} = useAuth(); |
| | | const {SvgIconVNode} = useSvgIcon(); |
| | | |
| | | // å³é®èåç¸å
³ |
| | | const showDropdown = ref(false); |
| | | const x = ref(0); |
| | | const y = ref(0); |
| | | const currentRow = ref<Api.Qm.Batch | null>(null); |
| | | |
| | | const dropdownOptions = [ |
| | | { |
| | | label: 'åå§æ°æ®ç»´æ¤', |
| | | key: 'raw-data-maintenance', |
| | | icon: SvgIconVNode({icon: 'mdi:database-edit-outline', fontSize: 18}) |
| | | }, |
| | | { |
| | | label: 'ç»¼åæµè¯å°æ°æ®ç»´æ¤', |
| | | key: 'test-bench-maintenance', |
| | | icon: SvgIconVNode({icon: 'mdi:monitor-dashboard', fontSize: 18}) |
| | | }, |
| | | { |
| | | label: 'æ°å»ºå¤æ£æ¹æ¬¡', |
| | | key: 'new-recheck-batch', |
| | | icon: SvgIconVNode({icon: 'mdi:plus-circle-outline', fontSize: 18}) |
| | | }, |
| | | { |
| | | type: 'divider', |
| | | key: 'd1' |
| | | }, |
| | | { |
| | | label: 'å·å
å·å¶æ£éªç»ææ¥å', |
| | | key: 'report-rolling', |
| | | icon: SvgIconVNode({icon: 'mdi:file-document-outline', fontSize: 18}) |
| | | }, |
| | | { |
| | | label: 'å
è£
æ è¯æ£éªåå§è®°å½', |
| | | key: 'record-packaging', |
| | | icon: SvgIconVNode({icon: 'mdi:barcode-scan', fontSize: 18}) |
| | | }, |
| | | { |
| | | label: 'çç«ã嫿°´çã嫿«çåå§è®°å½', |
| | | key: 'record-quality', |
| | | icon: SvgIconVNode({icon: 'mdi:water-percent', fontSize: 18}) |
| | | }, |
| | | { |
| | | label: '端é¨è½ä¸åå§è®°å½', |
| | | key: 'record-silk', |
| | | icon: SvgIconVNode({icon: 'mdi:format-list-bulleted-type', fontSize: 18}) |
| | | }, |
| | | { |
| | | label: 'ç»¼åæµè¯å°åå§è®°å½', |
| | | key: 'record-bench', |
| | | icon: SvgIconVNode({icon: 'mdi:chart-line', fontSize: 18}) |
| | | }, |
| | | { |
| | | label: 'å¤è§æ£éªåå§è®°å½', |
| | | key: 'record-appearance', |
| | | icon: SvgIconVNode({icon: 'mdi:eye-outline', fontSize: 18}) |
| | | }, |
| | | { |
| | | type: 'divider', |
| | | key: 'd2' |
| | | }, |
| | | { |
| | | label: $t('common.edit'), |
| | | key: 'edit', |
| | | icon: SvgIconVNode({icon: 'material-symbols:drive-file-rename-outline-outline', fontSize: 18}), |
| | | show: hasAuth('qm:batch:edit') |
| | | }, |
| | | { |
| | | label: $t('common.delete'), |
| | | key: 'delete', |
| | | icon: SvgIconVNode({icon: 'material-symbols:delete-outline', fontSize: 18}), |
| | | show: hasAuth('qm:batch:remove') |
| | | } |
| | | ]; |
| | | |
| | | function handleSelect(key: string) { |
| | | showDropdown.value = false; |
| | | if (!currentRow.value) return; |
| | | |
| | | if (key === 'edit') { |
| | | edit(currentRow.value.id); |
| | | } else if (key === 'delete') { |
| | | window.$dialog?.error({ |
| | | title: $t('common.confirmDelete'), |
| | | content: $t('common.confirmDelete'), |
| | | positiveText: $t('common.confirm'), |
| | | negativeText: $t('common.cancel'), |
| | | onPositiveClick: () => { |
| | | handleDelete(currentRow.value!.id); |
| | | } |
| | | }); |
| | | } else if (key === 'raw-data-maintenance') { |
| | | // è·³è½¬å° matcheck é¡µé¢ |
| | | if (!currentRow.value.judgeCode) { |
| | | window.$message?.warning('è¯¥æ¹æ¬¡æ²¡æå¤å®ä¾æ®'); |
| | | return; |
| | | } |
| | | router.push({ |
| | | path: '/qm/matcheck', |
| | | query: { |
| | | judgeCode: currentRow.value.judgeCode, |
| | | batchCode: currentRow.value.batchCode, |
| | | matCode: currentRow.value.matCode |
| | | } |
| | | }); |
| | | } else { |
| | | // å¤çå
¶ä»ä¸å¡æä½ |
| | | window.$message?.info(`ç¹å»äº: ${key}`); |
| | | } |
| | | } |
| | | |
| | | function handleRowProps(row: Api.Qm.Batch) { |
| | | return { |
| | | onContextmenu: (e: MouseEvent) => { |
| | | e.preventDefault(); |
| | | showDropdown.value = false; |
| | | nextTick().then(() => { |
| | | currentRow.value = row; |
| | | x.value = e.clientX; |
| | | y.value = e.clientY; |
| | | showDropdown.value = true; |
| | | }); |
| | | } |
| | | }; |
| | | } |
| | | |
| | | // ç±»å/åé¦MES/ç±»å«ç value->label æ å°ï¼ç¨äºè¡¨æ ¼æ¾ç¤ºï¼ |
| | | const TYP_MAP: Record<string, string> = { A: 'å¶ä¸', B: 'æå', C: 'å·å
', D: 'å°ç®±', E: 'ç³é¦æ' }; |
| | | const FLAG_MAP: Record<string, string> = { '0': 'æªä¸ä¼ mes', '1': 'å·²ä¸ä¼ ', '3': 'ä»MESä¸è½½' }; |
| | | const CATEGORY_MAP: Record<string, string> = { '0': 'æå', '1': 'è¾
æ' }; |
| | | const FLAG_MAP: Record<string, string> = {'0': 'æªä¸ä¼ mes', '1': 'å·²ä¸ä¼ ', '3': 'ä»MESä¸è½½'}; |
| | | const CATEGORY_MAP: Record<string, string> = {'0': 'æå', '1': 'è¾
æ'}; |
| | | |
| | | const searchParams = ref<Api.Qm.BatchSearchParams>({ |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | batchCode: null, |
| | | isflag: '1', |
| | | typ: null, |
| | | eqpCode: null, |
| | | matCode: null, |
| | |
| | | flag: null, |
| | | toMesDate: null, |
| | | fromMesDate: null, |
| | | deleted: null, |
| | | category: null, |
| | | enabled: '1', |
| | | deleted: 0, |
| | | category: '0', |
| | | state: null, |
| | | params: {} |
| | | params: { |
| | | beginBatchDate: `${new Date().getFullYear()}-${String(new Date().getMonth() + 1).padStart(2, '0')}-${String(new Date().getDate()).padStart(2, '0')} 00:00:00`, |
| | | endBatchDate: `${new Date().getFullYear()}-${String(new Date().getMonth() + 1).padStart(2, '0')}-${String(new Date().getDate()).padStart(2, '0')} 23:59:59` |
| | | } |
| | | }); |
| | | |
| | | const { columns, columnChecks, data, getData, getDataByPage, loading, mobilePagination, scrollX } = |
| | | const {columns, columnChecks, data, getData, getDataByPage, loading, mobilePagination, scrollX} = |
| | | useNaivePaginatedTable({ |
| | | api: () => fetchGetBatchList(searchParams.value), |
| | | transform: response => defaultTransform(response), |
| | |
| | | render: (_, index) => index + 1 |
| | | }, |
| | | { |
| | | key: 'id', |
| | | title: 'ç¼ç ', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'batchCode', |
| | | title: 'æ¹æ¬¡ä»£ç ', |
| | | title: 'æ¹æ¬¡å·', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'batchName', |
| | | title: 'æ¹æ¬¡åç§°', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'typ', |
| | | title: 'ç±»å', |
| | | align: 'center', |
| | | minWidth: 120, |
| | | render: row => TYP_MAP[row.typ] ?? row.typ |
| | | }, |
| | | { |
| | | key: 'eqpCode', |
| | | title: 'æºå°ä»£ç ', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'matCode', |
| | | key: 'matName', |
| | | title: 'çå·', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'judgeCode', |
| | | title: 'å¤å®ä¾æ®ä»£ç ', |
| | | key: 'judgeName', |
| | | title: 'å¤å®ä¾æ®', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | |
| | | key: 'isflag', |
| | | title: 'ä½¿ç¨æ å¿', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | minWidth: 120, |
| | | render: row => (row.isflag == '1' ? 'æ¯' : 'å¦') |
| | | }, |
| | | { |
| | | key: 'enabled', |
| | | title: 'å¯ç¨æ å¿', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | minWidth: 120, |
| | | render: row => (row.enabled == '1' ? 'æ¯' : 'å¦') |
| | | }, |
| | | { |
| | | key: 'totalNum', |
| | |
| | | key: 'deleted', |
| | | title: 'å 餿 å¿', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | minWidth: 120, |
| | | render: row => (row.deleted == 1 ? 'æ¯' : 'å¦') |
| | | }, |
| | | { |
| | | key: 'batchDes', |
| | |
| | | { |
| | | key: 'operate', |
| | | title: $t('common.operate'), |
| | | fixed: 'right', |
| | | align: 'center', |
| | | width: 130, |
| | | render: row => { |
| | |
| | | if (!hasAuth('qm:batch:edit') || !hasAuth('qm:batch:remove')) { |
| | | return null; |
| | | } |
| | | return <NDivider vertical />; |
| | | return <NDivider vertical/>; |
| | | }; |
| | | |
| | | const editBtn = () => { |
| | |
| | | ] |
| | | }); |
| | | |
| | | const { drawerVisible, operateType, editingData, handleAdd, handleEdit, checkedRowKeys, onBatchDeleted, onDeleted } = |
| | | const {drawerVisible, operateType, editingData, handleAdd, handleEdit, checkedRowKeys, onBatchDeleted, onDeleted} = |
| | | useTableOperate(data, 'id', getData); |
| | | |
| | | async function handleBatchDelete() { |
| | | // request |
| | | const { error } = await fetchBatchDeleteBatch(checkedRowKeys.value); |
| | | const {error} = await fetchBatchDeleteBatch(checkedRowKeys.value); |
| | | if (error) return; |
| | | onBatchDeleted(); |
| | | } |
| | | |
| | | async function handleDelete(id: CommonType.IdType) { |
| | | // request |
| | | const { error } = await fetchBatchDeleteBatch([id]); |
| | | const {error} = await fetchBatchDeleteBatch([id]); |
| | | if (error) return; |
| | | onDeleted(); |
| | | } |
| | |
| | | |
| | | <template> |
| | | <div class="min-h-500px flex-col-stretch gap-16px overflow-hidden lt-sm:overflow-auto"> |
| | | <BatchSearch v-model:model="searchParams" @search="getDataByPage" /> |
| | | <BatchSearch v-model:model="searchParams" @search="getDataByPage"/> |
| | | <NCard title="æ£éªæ¹æ¬¡å表" :bordered="false" size="small" class="card-wrapper sm:flex-1-hidden"> |
| | | <template #header-extra> |
| | | <TableHeaderOperation |
| | |
| | | remote |
| | | :row-key="row => row.id" |
| | | :pagination="mobilePagination" |
| | | :row-props="handleRowProps" |
| | | class="sm:h-full" |
| | | /> |
| | | <NDropdown |
| | | placement="bottom-start" |
| | | trigger="manual" |
| | | :x="x" |
| | | :y="y" |
| | | :options="dropdownOptions" |
| | | :show="showDropdown" |
| | | :on-clickoutside="() => (showDropdown = false)" |
| | | @select="handleSelect" |
| | | /> |
| | | <BatchOperateDrawer |
| | | v-model:visible="drawerVisible" |
| | | :operate-type="operateType" |
| | |
| | | <script setup lang="ts"> |
| | | import { computed, ref, watch } from 'vue'; |
| | | import { computed, onMounted, ref, watch } from 'vue'; |
| | | import { jsonClone } from '@sa/utils'; |
| | | import { fetchCreateBatch, fetchUpdateBatch } from '@/service/api/qm/batch'; |
| | | import { fetchGetMatList } from '@/service/api/md/mat'; |
| | | import { fetchGetJudgeList } from '@/service/api/qm/judge'; |
| | | import { useFormRules, useNaiveForm } from '@/hooks/common/form'; |
| | | import { $t } from '@/locales'; |
| | | |
| | |
| | | const { formRef, validate, restoreValidation } = useNaiveForm(); |
| | | const { createRequiredRule } = useFormRules(); |
| | | |
| | | // ç±»åé项ï¼A-å¶ä¸ B-æå C-å·å
D-å°ç®± E-ç³é¦æ |
| | | const typOptions = [ |
| | | { label: 'å¶ä¸', value: 'A' }, |
| | | { label: 'æå', value: 'B' }, |
| | | { label: 'å·å
', value: 'C' }, |
| | | { label: 'å°ç®±', value: 'D' }, |
| | | { label: 'ç³é¦æ', value: 'E' } |
| | | const matOptions = ref<CommonType.Option[]>([]); |
| | | const judgeOptions = ref<CommonType.Option[]>([]); |
| | | const stateOptions = [ |
| | | { label: 'æ£å¸¸', value: '0' }, |
| | | { label: 'åç¨', value: '1' } |
| | | ]; |
| | | |
| | | // åé¦MESé项ï¼0-æªä¸ä¼ mes 1-å·²ä¸ä¼ 3-ä»MESä¸è½½ |
| | | const flagOptions = [ |
| | | { label: 'æªä¸ä¼ mes', value: '0' }, |
| | | { label: 'å·²ä¸ä¼ ', value: '1' }, |
| | | { label: 'ä»MESä¸è½½', value: '3' } |
| | | ]; |
| | | async function getMatOptions() { |
| | | const { data, error } = await fetchGetMatList({ tid: '1' as any, pageSize: 1000 }); |
| | | if (!error) { |
| | | matOptions.value = data.rows.map(item => ({ |
| | | label: item.name, |
| | | value: item.code |
| | | })); |
| | | } |
| | | } |
| | | |
| | | // ç±»å«é项ï¼0-æå 1-è¾
æ |
| | | const categoryOptions = [ |
| | | { label: 'æå', value: '0' }, |
| | | { label: 'è¾
æ', value: '1' } |
| | | ]; |
| | | async function getJudgeOptions(matCode?: string | null) { |
| | | if (!matCode) { |
| | | judgeOptions.value = []; |
| | | return; |
| | | } |
| | | const params: Api.Qm.JudgeSearchParams = { category: 0, pageSize: 1000, matCode }; |
| | | const { data, error } = await fetchGetJudgeList(params); |
| | | if (!error) { |
| | | judgeOptions.value = data.rows.map(item => ({ |
| | | label: item.judgeName, |
| | | value: String(item.id) |
| | | })) as CommonType.Option[]; |
| | | } |
| | | } |
| | | |
| | | onMounted(() => { |
| | | getMatOptions(); |
| | | }); |
| | | |
| | | const title = computed(() => { |
| | | const titles: Record<NaiveUI.TableOperateType, string> = { |
| | |
| | | id: '', |
| | | batchCode: '', |
| | | batchName: '', |
| | | typ: '', |
| | | typ: '0', |
| | | eqpCode: '', |
| | | matCode: '', |
| | | matCode: null, |
| | | judgeCode: '', |
| | | batchDate: null, |
| | | isflag: '', |
| | | enabled: '', |
| | | isflag: '0', |
| | | enabled: '1', |
| | | totalNum: null, |
| | | results: '', |
| | | approver: '', |
| | |
| | | verName: '', |
| | | verCode: '', |
| | | archDate: '', |
| | | flag: '', |
| | | flag: '0', |
| | | toMesDate: null, |
| | | fromMesDate: null, |
| | | deleted: null, |
| | | deleted: 0, |
| | | batchDes: '', |
| | | category: '', |
| | | category: '0', |
| | | makeno: '', |
| | | shifteqpno: '', |
| | | boxno: '', |
| | | pid: '', |
| | | reviewer: '', |
| | | rvcount: null, |
| | | state: '', |
| | | state: '0', |
| | | reviewTime: null, |
| | | auditTime: null, |
| | | spec: '', |
| | |
| | | }; |
| | | } |
| | | |
| | | type RuleKey = Extract<keyof Model, 'id'>; |
| | | type RuleKey = Extract<keyof Model, 'batchCode' | 'matCode'>; |
| | | |
| | | const rules: Record<RuleKey, App.Global.FormRule> = { |
| | | id: createRequiredRule('ç¼ç ä¸è½ä¸ºç©º') |
| | | batchCode: createRequiredRule('æ¹æ¬¡å·ä¸è½ä¸ºç©º'), |
| | | matCode: createRequiredRule('çå·ä¸è½ä¸ºç©º') |
| | | }; |
| | | |
| | | function handleUpdateModelWhenEdit() { |
| | |
| | | if (visible.value) { |
| | | handleUpdateModelWhenEdit(); |
| | | restoreValidation(); |
| | | getJudgeOptions(model.value.matCode); |
| | | } |
| | | }); |
| | | |
| | | watch( |
| | | () => model.value.matCode, |
| | | newVal => { |
| | | if (visible.value) { |
| | | model.value.judgeCode = ''; |
| | | getJudgeOptions(newVal); |
| | | } |
| | | } |
| | | ); |
| | | </script> |
| | | |
| | | <template> |
| | | <NDrawer v-model:show="visible" :title="title" display-directive="show" :width="800" class="max-w-90%"> |
| | | <NDrawerContent :title="title" :native-scrollbar="false" closable> |
| | | <NForm ref="formRef" :model="model" :rules="rules"> |
| | | <NFormItem label="æ¹æ¬¡ä»£ç " path="batchCode"> |
| | | <NInput v-model:value="model.batchCode" placeholder="请è¾å
¥æ¹æ¬¡ä»£ç " /> |
| | | </NFormItem> |
| | | <NFormItem label="æ¹æ¬¡åç§°" path="batchName"> |
| | | <NInput v-model:value="model.batchName" placeholder="请è¾å
¥æ¹æ¬¡åç§°" /> |
| | | </NFormItem> |
| | | <NFormItem label="ç±»å" path="typ"> |
| | | <NSelect v-model:value="model.typ" :options="typOptions" placeholder="è¯·éæ©ç±»å" clearable /> |
| | | </NFormItem> |
| | | <NFormItem label="æºå°ä»£ç " path="eqpCode"> |
| | | <NInput v-model:value="model.eqpCode" placeholder="请è¾å
¥æºå°ä»£ç " /> |
| | | <NForm ref="formRef" :model="model" :rules="rules" label-placement="left" :label-width="100"> |
| | | <NFormItem label="æ¹æ¬¡å·" path="batchCode"> |
| | | <NInput v-model:value="model.batchCode" placeholder="请è¾å
¥æ¹æ¬¡å·" /> |
| | | </NFormItem> |
| | | <NFormItem label="çå·" path="matCode"> |
| | | <NInput v-model:value="model.matCode" placeholder="请è¾å
¥çå·" /> |
| | | <NSelect v-model:value="model.matCode" :options="matOptions" placeholder="è¯·éæ©çå·" clearable filterable /> |
| | | </NFormItem> |
| | | <NFormItem label="å¤å®ä¾æ®ä»£ç " path="judgeCode"> |
| | | <NInput v-model:value="model.judgeCode" placeholder="请è¾å
¥å¤å®ä¾æ®ä»£ç " /> |
| | | </NFormItem> |
| | | <NFormItem label="æ¹æ¬¡çææ¥æ" path="batchDate"> |
| | | <NDatePicker |
| | | v-model:formatted-value="model.batchDate" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | <NFormItem label="å¤å®ä¾æ®" path="judgeCode"> |
| | | <NSelect |
| | | v-model:value="model.judgeCode" |
| | | :options="judgeOptions" |
| | | placeholder="è¯·éæ©å¤å®ä¾æ®" |
| | | clearable |
| | | /> |
| | | </NFormItem> |
| | | <NFormItem label="ä½¿ç¨æ å¿" path="isflag"> |
| | | <NInput v-model:value="model.isflag" placeholder="请è¾å
¥ä½¿ç¨æ å¿" /> |
| | | </NFormItem> |
| | | <NFormItem label="å¯ç¨æ å¿" path="enabled"> |
| | | <NInput v-model:value="model.enabled" placeholder="请è¾å
¥å¯ç¨æ å¿" /> |
| | | </NFormItem> |
| | | <NFormItem label="å°è´§æ»é" path="totalNum"> |
| | | <NInputNumber v-model:value="model.totalNum" placeholder="请è¾å
¥å°è´§æ»é" class="w-full" /> |
| | | </NFormItem> |
| | | <NFormItem label="综åå¤å®" path="results"> |
| | | <NInput v-model:value="model.results" placeholder="请è¾å
¥ç»¼åå¤å®" /> |
| | | </NFormItem> |
| | | <NFormItem label="æ¹å人" path="approver"> |
| | | <NInput v-model:value="model.approver" placeholder="请è¾å
¥æ¹å人" /> |
| | | </NFormItem> |
| | | <NFormItem label="å®¡æ ¸äºº" path="auditor"> |
| | | <NInput v-model:value="model.auditor" placeholder="请è¾å
¥å®¡æ ¸äºº" /> |
| | | </NFormItem> |
| | | <NFormItem label="å建人" path="creater"> |
| | | <NInput v-model:value="model.creater" placeholder="请è¾å
¥å建人" /> |
| | | </NFormItem> |
| | | <NFormItem label="å¶è¡¨æ¥æ" path="tabDate"> |
| | | <NDatePicker |
| | | v-model:formatted-value="model.tabDate" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | clearable |
| | | /> |
| | | </NFormItem> |
| | | <NFormItem label="çæ¬åç§°" path="verName"> |
| | | <NInput v-model:value="model.verName" placeholder="请è¾å
¥çæ¬åç§°" /> |
| | | </NFormItem> |
| | | <NFormItem label="çæ¬ç¼å·" path="verCode"> |
| | | <NInput v-model:value="model.verCode" placeholder="请è¾å
¥çæ¬ç¼å·" /> |
| | | </NFormItem> |
| | | <NFormItem label="ä¿åæ" path="archDate"> |
| | | <NInput v-model:value="model.archDate" placeholder="请è¾å
¥ä¿åæ" /> |
| | | </NFormItem> |
| | | <NFormItem label="åé¦MES" path="flag"> |
| | | <NSelect v-model:value="model.flag" :options="flagOptions" placeholder="è¯·éæ©åé¦MES" clearable /> |
| | | </NFormItem> |
| | | <NFormItem label="ä¸ä¼ MESæ¶é´" path="toMesDate"> |
| | | <NDatePicker |
| | | v-model:formatted-value="model.toMesDate" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | clearable |
| | | /> |
| | | </NFormItem> |
| | | <NFormItem label="ä»MESæ¶é´ä¸è½½" path="fromMesDate"> |
| | | <NDatePicker |
| | | v-model:formatted-value="model.fromMesDate" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | clearable |
| | | /> |
| | | </NFormItem> |
| | | <NFormItem label="å 餿 å¿" path="deleted"> |
| | | <NInputNumber v-model:value="model.deleted" placeholder="请è¾å
¥å 餿 å¿" class="w-full" /> |
| | | </NFormItem> |
| | | <NFormItem label="æ¹æ¬¡æè¿°" path="batchDes"> |
| | | <NInput v-model:value="model.batchDes" placeholder="请è¾å
¥æ¹æ¬¡æè¿°" /> |
| | | </NFormItem> |
| | | <NFormItem label="ç±»å«" path="category"> |
| | | <NSelect v-model:value="model.category" :options="categoryOptions" placeholder="è¯·éæ©ç±»å«" clearable /> |
| | | </NFormItem> |
| | | <NFormItem label="å·å¶å·¥å·" path="makeno"> |
| | | <NInput v-model:value="model.makeno" placeholder="请è¾å
¥å·å¶å·¥å·" /> |
| | | </NFormItem> |
| | | <NFormItem label="çæ¬¡æºå·" path="shifteqpno"> |
| | | <NInput v-model:value="model.shifteqpno" placeholder="请è¾å
¥ç次æºå·" /> |
| | | </NFormItem> |
| | | <NFormItem label="è£
ç®±å·" path="boxno"> |
| | | <NInput v-model:value="model.boxno" placeholder="请è¾å
¥è£
ç®±å·" /> |
| | | </NFormItem> |
| | | <NFormItem label="ç¶æ¹æ¬¡å·" path="pid"> |
| | | <NInput v-model:value="model.pid as any" placeholder="请è¾å
¥ç¶æ¹æ¬¡å·" /> |
| | | </NFormItem> |
| | | <NFormItem label="夿 ¸äºº" path="reviewer"> |
| | | <NInput v-model:value="model.reviewer" placeholder="请è¾å
¥å¤æ ¸äºº" /> |
| | | </NFormItem> |
| | | <NFormItem label="夿£æ¬¡æ°" path="rvcount"> |
| | | <NInputNumber v-model:value="model.rvcount" placeholder="请è¾å
¥å¤æ£æ¬¡æ°" class="w-full" /> |
| | | </NFormItem> |
| | | <NFormItem label="æ¹æ¬¡ç¶æ" path="state"> |
| | | <NInput v-model:value="model.state" placeholder="请è¾å
¥æ¹æ¬¡ç¶æ" /> |
| | | </NFormItem> |
| | | <NFormItem label="夿 ¸æ¥æ" path="reviewTime"> |
| | | <NDatePicker |
| | | v-model:formatted-value="model.reviewTime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | clearable |
| | | /> |
| | | </NFormItem> |
| | | <NFormItem label="å®¡æ ¸æ¥æ" path="auditTime"> |
| | | <NDatePicker |
| | | v-model:formatted-value="model.auditTime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | clearable |
| | | filterable |
| | | /> |
| | | </NFormItem> |
| | | <NFormItem label="è§æ ¼" path="spec"> |
| | | <NInput v-model:value="model.spec" placeholder="请è¾å
¥è§æ ¼" /> |
| | | </NFormItem> |
| | | <NFormItem label="æ¹åæ¶é´" path="approveTime"> |
| | | <NDatePicker |
| | | v-model:formatted-value="model.approveTime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | clearable |
| | | /> |
| | | <NFormItem label="è£
ç®±å·" path="boxno"> |
| | | <NInput v-model:value="model.boxno" placeholder="请è¾å
¥è£
ç®±å·" /> |
| | | </NFormItem> |
| | | <NFormItem label="å°è´§åä½" path="unit"> |
| | | <NInput v-model:value="model.unit" placeholder="请è¾å
¥å°è´§åä½" /> |
| | | <NFormItem label="çæ¬¡æºå·" path="shifteqpno"> |
| | | <NInput v-model:value="model.shifteqpno" placeholder="请è¾å
¥ç次æºå·" /> |
| | | </NFormItem> |
| | | <NFormItem label="å°è´§æ¥æ" path="arrivalTime"> |
| | | <NDatePicker |
| | | v-model:formatted-value="model.arrivalTime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | clearable |
| | | /> |
| | | <NFormItem label="æè¿°" path="batchDes"> |
| | | <NInput v-model:value="model.batchDes" placeholder="请è¾å
¥æè¿°" /> |
| | | </NFormItem> |
| | | <NFormItem label="åæ¾å°ç¹" path="storagePlace"> |
| | | <NInput v-model:value="model.storagePlace" placeholder="请è¾å
¥åæ¾å°ç¹" /> |
| | | </NFormItem> |
| | | <NFormItem label="æ£éªå" path="checker"> |
| | | <NInput v-model:value="model.checker" placeholder="请è¾å
¥æ£éªå" /> |
| | | </NFormItem> |
| | | <NFormItem label="æ¥åæ¥æ" path="receiveTime"> |
| | | <NDatePicker |
| | | v-model:formatted-value="model.receiveTime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | clearable |
| | | /> |
| | | </NFormItem> |
| | | <NFormItem label="æ¥æ£æ¥æ" path="inspTime"> |
| | | <NDatePicker |
| | | v-model:formatted-value="model.inspTime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | clearable |
| | | /> |
| | | </NFormItem> |
| | | <NFormItem label="ä»åºä¿ç®¡å" path="storer"> |
| | | <NInput v-model:value="model.storer" placeholder="请è¾å
¥ä»åºä¿ç®¡å" /> |
| | | </NFormItem> |
| | | <NFormItem label="æ¯å¦éªè¯" path="isverify"> |
| | | <NInput v-model:value="model.isverify" placeholder="请è¾å
¥æ¯å¦éªè¯" /> |
| | | </NFormItem> |
| | | <NFormItem label="æ¯å¦æ£éª" path="ischk"> |
| | | <NInput v-model:value="model.ischk" placeholder="请è¾å
¥æ¯å¦æ£éª" /> |
| | | </NFormItem> |
| | | <NFormItem label="å¤ç¨1" path="bak1"> |
| | | <NInput v-model:value="model.bak1" placeholder="请è¾å
¥å¤ç¨1" /> |
| | | </NFormItem> |
| | | <NFormItem label="å¤ç¨2" path="bak2"> |
| | | <NInput v-model:value="model.bak2" placeholder="请è¾å
¥å¤ç¨2" /> |
| | | <NFormItem label="ç¶æ" path="state"> |
| | | <NSelect v-model:value="model.state" :options="stateOptions" placeholder="è¯·éæ©ç¶æ" clearable /> |
| | | </NFormItem> |
| | | </NForm> |
| | | <template #footer> |
| | |
| | | <script setup lang="ts"> |
| | | import { ref, toRaw } from 'vue'; |
| | | import { onMounted, ref, toRaw, watch } from 'vue'; |
| | | import { jsonClone } from '@sa/utils'; |
| | | import { fetchGetMatList } from '@/service/api/md/mat'; |
| | | import { useNaiveForm } from '@/hooks/common/form'; |
| | | import { $t } from '@/locales'; |
| | | |
| | |
| | | |
| | | const { formRef, validate, restoreValidation } = useNaiveForm(); |
| | | |
| | | const dateRangeToMesDate = ref<[string, string] | null>(null); |
| | | const dateRangeFromMesDate = ref<[string, string] | null>(null); |
| | | const model = defineModel<Api.Qm.BatchSearchParams>('model', { required: true }); |
| | | |
| | | const dateRangeBatchDate = ref<[string, string] | null>(null); |
| | | |
| | | const matOptions = ref<CommonType.Option[]>([]); |
| | | |
| | | async function getMatOptions() { |
| | | const { data } = await fetchGetMatList({ tid: '1' as any, pageSize: 1000 }); |
| | | if (data) { |
| | | matOptions.value = data.rows.map(item => ({ |
| | | label: item.name, |
| | | value: item.code |
| | | })); |
| | | } |
| | | } |
| | | |
| | | onMounted(() => { |
| | | getMatOptions(); |
| | | }); |
| | | |
| | | // sync model params to dateRangeBatchDate |
| | | watch( |
| | | () => model.value.params, |
| | | val => { |
| | | if (val?.beginBatchDate && val?.endBatchDate) { |
| | | dateRangeBatchDate.value = [val.beginBatchDate, val.endBatchDate]; |
| | | } else { |
| | | dateRangeBatchDate.value = null; |
| | | } |
| | | }, |
| | | { immediate: true, deep: true } |
| | | ); |
| | | |
| | | const defaultModel = jsonClone(toRaw(model.value)); |
| | | |
| | | // ç±»åé项ï¼A-å¶ä¸ B-æå C-å·å
D-å°ç®± E-ç³é¦æ |
| | | const typOptions = [ |
| | | { label: 'å¶ä¸', value: 'A' }, |
| | | { label: 'æå', value: 'B' }, |
| | | { label: 'å·å
', value: 'C' }, |
| | | { label: 'å°ç®±', value: 'D' }, |
| | | { label: 'ç³é¦æ', value: 'E' } |
| | | ]; |
| | | |
| | | // åé¦MESé项ï¼0-æªä¸ä¼ mes 1-å·²ä¸ä¼ 3-ä»MESä¸è½½ |
| | | const flagOptions = [ |
| | | { label: 'æªä¸ä¼ mes', value: '0' }, |
| | | { label: 'å·²ä¸ä¼ ', value: '1' }, |
| | | { label: 'ä»MESä¸è½½', value: '3' } |
| | | ]; |
| | | |
| | | // ç±»å«é项ï¼0-æå 1-è¾
æ |
| | | const categoryOptions = [ |
| | | { label: 'æå', value: '0' }, |
| | | { label: 'è¾
æ', value: '1' } |
| | | ]; |
| | | function onDateRangeBatchDateUpdate(value: [string, string] | null) { |
| | | if (value && value.length === 2) { |
| | | model.value.params!.beginBatchDate = value[0]; |
| | | model.value.params!.endBatchDate = value[1]; |
| | | } else { |
| | | model.value.params!.beginBatchDate = undefined; |
| | | model.value.params!.endBatchDate = undefined; |
| | | } |
| | | } |
| | | |
| | | function resetModel() { |
| | | dateRangeToMesDate.value = null; |
| | | dateRangeFromMesDate.value = null; |
| | | Object.assign(model.value, defaultModel); |
| | | Object.assign(model.value, jsonClone(defaultModel)); |
| | | } |
| | | |
| | | async function reset() { |
| | |
| | | |
| | | async function search() { |
| | | await validate(); |
| | | if (dateRangeToMesDate.value?.length) { |
| | | model.value.params!.beginToMesDate = dateRangeToMesDate.value[0]; |
| | | model.value.params!.endToMesDate = dateRangeToMesDate.value[1]; |
| | | } |
| | | if (dateRangeFromMesDate.value?.length) { |
| | | model.value.params!.beginFromMesDate = dateRangeFromMesDate.value[0]; |
| | | model.value.params!.endFromMesDate = dateRangeFromMesDate.value[1]; |
| | | } |
| | | emit('search'); |
| | | } |
| | | </script> |
| | |
| | | <NCard :bordered="false" size="small" class="card-wrapper"> |
| | | <NCollapse> |
| | | <NCollapseItem :title="$t('common.search')" name="qm-batch-search"> |
| | | <NForm ref="formRef" :model="model" label-placement="left" :label-width="80"> |
| | | <NForm ref="formRef" :model="model" label-placement="left" :label-width="110"> |
| | | <NGrid responsive="screen" item-responsive> |
| | | <NFormItemGi span="24 s:12 m:8" label="æ¹æ¬¡ä»£ç " label-width="auto" path="batchCode" class="pr-24px"> |
| | | <NInput v-model:value="model.batchCode" placeholder="请è¾å
¥æ¹æ¬¡ä»£ç " /> |
| | | </NFormItemGi> |
| | | <NFormItemGi span="24 s:12 m:8" label="ç±»å" label-width="auto" path="typ" class="pr-24px"> |
| | | <NSelect v-model:value="model.typ" :options="typOptions" placeholder="è¯·éæ©ç±»å" clearable /> |
| | | </NFormItemGi> |
| | | <NFormItemGi span="24 s:12 m:8" label="æºå°ä»£ç " label-width="auto" path="eqpCode" class="pr-24px"> |
| | | <NInput v-model:value="model.eqpCode" placeholder="请è¾å
¥æºå°ä»£ç " /> |
| | | </NFormItemGi> |
| | | <NFormItemGi span="24 s:12 m:8" label="çå·" label-width="auto" path="matCode" class="pr-24px"> |
| | | <NInput v-model:value="model.matCode" placeholder="请è¾å
¥çå·" /> |
| | | </NFormItemGi> |
| | | <NFormItemGi span="24 s:12 m:8" label="æ¹æ¬¡çææ¥æ" label-width="auto" path="batchDate" class="pr-24px"> |
| | | <NDatePicker |
| | | v-model:formatted-value="model.batchDate" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | clearable |
| | | /> |
| | | </NFormItemGi> |
| | | <NFormItemGi span="24 s:12 m:8" label="åé¦MES" label-width="auto" path="flag" class="pr-24px"> |
| | | <NSelect v-model:value="model.flag" :options="flagOptions" placeholder="è¯·éæ©åé¦MES" clearable /> |
| | | </NFormItemGi> |
| | | <NFormItemGi span="24 s:12 m:8" label="ä¸ä¼ MESæ¶é´" label-width="auto" path="toMesDate" class="pr-24px"> |
| | | <NDatePicker |
| | | v-model:formatted-value="dateRangeToMesDate" |
| | | v-model:formatted-value="dateRangeBatchDate" |
| | | type="datetimerange" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | clearable |
| | | :default-time="['00:00:00', '23:59:59']" |
| | | @update:formatted-value="onDateRangeBatchDateUpdate" |
| | | /> |
| | | </NFormItemGi> |
| | | <NFormItemGi span="24 s:12 m:8" label="ä»MESæ¶é´ä¸è½½" label-width="auto" path="fromMesDate" class="pr-24px"> |
| | | <NDatePicker |
| | | v-model:formatted-value="dateRangeFromMesDate" |
| | | type="datetimerange" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | <NFormItemGi span="24 s:12 m:8" label="çå·" label-width="auto" path="matCode" class="pr-24px"> |
| | | <NSelect v-model:value="model.matCode" placeholder="è¯·éæ©çå·" :options="matOptions" clearable /> |
| | | </NFormItemGi> |
| | | <NFormItemGi span="24 s:12 m:8" label="ä½¿ç¨æ å¿" label-width="auto" path="isflag" class="pr-24px"> |
| | | <NSelect |
| | | v-model:value="model.isflag" |
| | | placeholder="è¯·éæ©ä½¿ç¨æ å¿" |
| | | :options="[ |
| | | { label: 'æ¯', value: '1' }, |
| | | { label: 'å¦', value: '0' } |
| | | ]" |
| | | clearable |
| | | /> |
| | | </NFormItemGi> |
| | | <NFormItemGi span="24 s:12 m:8" label="å¯ç¨æ å¿" label-width="auto" path="enabled" class="pr-24px"> |
| | | <NSelect |
| | | v-model:value="model.enabled" |
| | | placeholder="è¯·éæ©å¯ç¨æ å¿" |
| | | :options="[ |
| | | { label: 'æ¯', value: '1' }, |
| | | { label: 'å¦', value: '0' } |
| | | ]" |
| | | clearable |
| | | /> |
| | | </NFormItemGi> |
| | | <NFormItemGi span="24 s:12 m:8" label="å 餿 å¿" label-width="auto" path="deleted" class="pr-24px"> |
| | | <NInputNumber v-model:value="model.deleted" placeholder="请è¾å
¥å 餿 å¿" class="w-full" /> |
| | | <NSelect |
| | | v-model:value="model.deleted" |
| | | placeholder="è¯·éæ©å 餿 å¿" |
| | | :options="[ |
| | | { label: 'æ¯', value: 1 }, |
| | | { label: 'å¦', value: 0 } |
| | | ]" |
| | | clearable |
| | | /> |
| | | </NFormItemGi> |
| | | <NFormItemGi span="24 s:12 m:8" label="ç±»å«" label-width="auto" path="category" class="pr-24px"> |
| | | <NSelect v-model:value="model.category" :options="categoryOptions" placeholder="è¯·éæ©ç±»å«" clearable /> |
| | | </NFormItemGi> |
| | | <NFormItemGi span="24 s:12 m:8" label="æ¹æ¬¡ç¶æ" label-width="auto" path="state" class="pr-24px"> |
| | | <NInput v-model:value="model.state" placeholder="请è¾å
¥æ¹æ¬¡ç¶æ" /> |
| | | </NFormItemGi> |
| | | <NFormItemGi :show-feedback="false" span="24" class="pr-24px"> |
| | | <NSpace class="w-full" justify="end"> |
| | | <NButton @click="reset"> |
| | | <template #icon> |
| | | <icon-ic-round-refresh class="text-icon" /> |
| | | </template> |
| | | {{ $t('common.reset') }} |
| | | </NButton> |
| | | <NFormItemGi :show-feedback="false" span="24 s:12 m:8" class="pr-24px"> |
| | | <NSpace class="w-full" justify="start"> |
| | | <NButton type="primary" ghost @click="search"> |
| | | <template #icon> |
| | | <icon-ic-round-search class="text-icon" /> |
| | | </template> |
| | | {{ $t('common.search') }} |
| | | </NButton> |
| | | <NButton @click="reset"> |
| | | <template #icon> |
| | | <icon-ic-round-refresh class="text-icon" /> |
| | | </template> |
| | | {{ $t('common.reset') }} |
| | | </NButton> |
| | | </NSpace> |
| | | </NFormItemGi> |
| | | </NGrid> |
| | |
| | | return titles[props.operateType]; |
| | | }); |
| | | |
| | | const clsOptions = [ |
| | | { label: 'A', value: 'A' }, |
| | | { label: 'B', value: 'B' }, |
| | | { label: 'C', value: 'C' }, |
| | | { label: 'D', value: 'D' } |
| | | ]; |
| | | |
| | | type Model = Api.Qm.JudgeDetailsOperateParams; |
| | | |
| | | const model = ref<Model>(createDefaultModel()); |
| | |
| | | |
| | | type RuleKey = Extract<keyof Model, 'id'>; |
| | | |
| | | const rules: Record<RuleKey, App.Global.FormRule> = {}; |
| | | const rules: Record<RuleKey, App.Global.FormRule | App.Global.FormRule[]> = { |
| | | id: createRequiredRule('请è¾å
¥ç¼ç ') |
| | | }; |
| | | |
| | | function handleUpdateModelWhenEdit() { |
| | | model.value = createDefaultModel(); |
| | | |
| | | if (props.operateType === 'edit' && props.rowData) { |
| | | if (props.rowData) { |
| | | Object.assign(model.value, jsonClone(props.rowData)); |
| | | } |
| | | } |
| | |
| | | <NDrawer v-model:show="visible" :title="title" display-directive="show" :width="800" class="max-w-90%"> |
| | | <NDrawerContent :title="title" :native-scrollbar="false" closable> |
| | | <NForm ref="formRef" :model="model" :rules="rules"> |
| | | <NFormItem label="ç¼ç " path="id"> |
| | | <NInput v-model:value="model.id" placeholder="请è¾å
¥ç¼ç " /> |
| | | </NFormItem> |
| | | <NFormItem label="å¤å®ä¸»æ è¯" path="judgeId"> |
| | | <NInput v-model:value="model.judgeId" placeholder="请è¾å
¥å¤å®ä¸»æ è¯" /> |
| | | </NFormItem> |
| | | <NFormItem label="å¤å®é¡¹ITEM" path="itemCod"> |
| | | <NInput v-model:value="model.itemCod" placeholder="请è¾å
¥å¤å®é¡¹ITEM" /> |
| | | </NFormItem> |
| | | <NFormItem label="å¤å®é¡¹NAME" path="itemName"> |
| | | <NInput v-model:value="model.itemName" placeholder="请è¾å
¥å¤å®é¡¹NAME" /> |
| | | <NFormItem label="å¤å®é¡¹" path="itemName"> |
| | | <NInput v-model:value="(model.itemName as any)" placeholder="请è¾å
¥å¤å®é¡¹" :disabled="operateType === 'edit'" /> |
| | | </NFormItem> |
| | | <NFormItem label="æ åå¼" path="value3"> |
| | | <NInput v-model:value="model.value3" placeholder="请è¾å
¥æ åå¼" /> |
| | | <NInputNumber v-model:value="(model.value3 as any)" placeholder="请è¾å
¥æ åå¼" class="w-full" /> |
| | | </NFormItem> |
| | | <NFormItem label="å¤å®å¼1" path="value1"> |
| | | <NInput v-model:value="model.value1" placeholder="请è¾å
¥å¤å®å¼1" /> |
| | | <NFormItem label="ä¸éå¼" path="value1"> |
| | | <NInputNumber v-model:value="(model.value1 as any)" placeholder="请è¾å
¥ä¸éå¼" class="w-full" /> |
| | | </NFormItem> |
| | | <NFormItem label="å¤å®å¼2" path="value2"> |
| | | <NInput v-model:value="model.value2" placeholder="请è¾å
¥å¤å®å¼2" /> |
| | | <NFormItem label="ä¸éå¼" path="value2"> |
| | | <NInputNumber v-model:value="(model.value2 as any)" placeholder="请è¾å
¥ä¸éå¼" class="w-full" /> |
| | | </NFormItem> |
| | | <NFormItem label="缺é·ä½ç½®" path="location"> |
| | | <NInput v-model:value="model.location" placeholder="请è¾å
¥ç¼ºé·ä½ç½®" /> |
| | | <NFormItem label="åå¼" path="stdscore"> |
| | | <NInputNumber v-model:value="(model.stdscore as any)" placeholder="请è¾å
¥åå¼" class="w-full" /> |
| | | </NFormItem> |
| | | <NFormItem label="å¤å®çº§å« (A,B,C,D)" path="cls"> |
| | | <NInput v-model:value="model.cls" placeholder="请è¾å
¥å¤å®çº§å« (A,B,C,D)" /> |
| | | </NFormItem> |
| | | <NFormItem label="å弿 å (æ£åæ åï¼å¾åæ å),æ¯å¦ä¸åæ ¼ä¸æ¬¡æ£å¤å°å" path="stdscore"> |
| | | <NInput |
| | | v-model:value="model.stdscore" |
| | | placeholder="请è¾å
¥å弿 å (æ£åæ åï¼å¾åæ å),æ¯å¦ä¸åæ ¼ä¸æ¬¡æ£å¤å°å" |
| | | /> |
| | | </NFormItem> |
| | | <NFormItem label="æ è®°æ¤é¡¹æ¯å¦ä¸ºåæé¡¹ç®ï¼æ¯å¦å¤è§ï¼å®é
ä¸å
³èäºå¾å¤å项ç®" path="ismix"> |
| | | <NInput |
| | | v-model:value="model.ismix" |
| | | placeholder="请è¾å
¥æ è®°æ¤é¡¹æ¯å¦ä¸ºåæé¡¹ç®ï¼æ¯å¦å¤è§ï¼å®é
ä¸å
³èäºå¾å¤å项ç®" |
| | | /> |
| | | </NFormItem> |
| | | <NFormItem label="è¥æ¤å段æUUIDå¼ï¼è¡¨æå®å¯è½ä¸ºå
¶ä»é¡¹ç®çåé¡¹ï¼æ¯å¦â空头â,å®ä¸ºçæ¯å¤è§é¡¹ç®çå项" path="rid"> |
| | | <NInput |
| | | v-model:value="model.rid" |
| | | placeholder="请è¾å
¥è¥æ¤å段æUUIDå¼ï¼è¡¨æå®å¯è½ä¸ºå
¶ä»é¡¹ç®çåé¡¹ï¼æ¯å¦â空头â,å®ä¸ºçæ¯å¤è§é¡¹ç®çå项" |
| | | /> |
| | | </NFormItem> |
| | | <NFormItem label="èå´-å¤ç¨" path="category"> |
| | | <NInput v-model:value="model.category" placeholder="请è¾å
¥èå´-å¤ç¨" /> |
| | | <NFormItem label="å¤å®çº§å«" path="cls"> |
| | | <NSelect v-model:value="(model.cls as any)" :options="clsOptions" placeholder="è¯·éæ©å¤å®çº§å«" /> |
| | | </NFormItem> |
| | | <NFormItem label="夿³¨" path="decisionDes"> |
| | | <NInput v-model:value="model.decisionDes" placeholder="请è¾å
¥å¤æ³¨" /> |
| | | </NFormItem> |
| | | <NFormItem label="ä¿®æ¹äºº" path="updateUser"> |
| | | <NInput v-model:value="model.updateUser" placeholder="请è¾å
¥ä¿®æ¹äºº" /> |
| | | <NInput v-model:value="(model.decisionDes as any)" type="textarea" placeholder="请è¾å
¥å¤æ³¨" /> |
| | | </NFormItem> |
| | | </NForm> |
| | | <template #footer> |
| | |
| | | import ButtonIcon from '@/components/custom/button-icon.vue'; |
| | | import JudgeOperateDrawer from './modules/judge-operate-drawer.vue'; |
| | | import JudgeSearch from './modules/judge-search.vue'; |
| | | import JudgeDetailsSubTable from '../judge-details/modules/judge-details-sub-table.vue'; |
| | | import StdSubTable from "@/views/qm/std/modules/std-sub-table.vue"; |
| | | |
| | | defineOptions({ |
| | | name: 'JudgeList' |
| | |
| | | const { download } = useDownload(); |
| | | const { hasAuth } = useAuth(); |
| | | |
| | | const selectedJudgeId = ref<CommonType.IdType | null>(null); |
| | | |
| | | const searchParams = ref<Api.Qm.JudgeSearchParams>({ |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | |
| | | matName: null, |
| | | judgeName: null, |
| | | category: 0, // é»è®¤éæ©æå |
| | | status: -1, // é»è®¤éæ©å
¨é¨ |
| | | status: 1, // é»è®¤æ¥è¯¢å¯ç¨ |
| | | params: {} |
| | | }); |
| | | |
| | |
| | | function handleExport() { |
| | | download('/qm/judge/export', searchParams.value, `å¤å®ä¾æ®_${new Date().getTime()}.xlsx`); |
| | | } |
| | | |
| | | function handleRowClick(row: any) { |
| | | return { |
| | | onClick: (e: MouseEvent) => { |
| | | const target = e.target as HTMLElement | null; |
| | | if (target?.closest('.n-checkbox') || target?.closest('.n-button') || target?.closest('a')) return; |
| | | selectedJudgeId.value = row.id; |
| | | }, |
| | | style: 'cursor: pointer;' |
| | | }; |
| | | } |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="min-h-500px flex-col-stretch gap-16px overflow-hidden lt-sm:overflow-auto"> |
| | | <JudgeSearch v-model:model="searchParams" @search="getDataByPage" /> |
| | | <NCard title="å¤å®ä¾æ®å表" :bordered="false" size="small" class="card-wrapper sm:flex-1-hidden"> |
| | | <template #header-extra> |
| | | <TableHeaderOperation |
| | | v-model:columns="columnChecks" |
| | | :disabled-delete="checkedRowKeys.length === 0" |
| | | :loading="loading" |
| | | :show-add="hasAuth('qm:judge:add')" |
| | | :show-delete="hasAuth('qm:judge:remove')" |
| | | :show-export="hasAuth('qm:judge:export')" |
| | | @add="handleAdd" |
| | | @delete="handleBatchDelete" |
| | | @export="handleExport" |
| | | @refresh="getData" |
| | | /> |
| | | </template> |
| | | <NDataTable |
| | | v-model:checked-row-keys="checkedRowKeys" |
| | | :columns="columns" |
| | | :data="data" |
| | | <div class="judge-content-area relative flex-col-stretch gap-16px sm:flex-1-hidden"> |
| | | <NCard |
| | | title="å¤å®ä¾æ®å表" |
| | | :bordered="false" |
| | | size="small" |
| | | :flex-height="!appStore.isMobile" |
| | | :scroll-x="scrollX" |
| | | :loading="loading" |
| | | remote |
| | | :row-key="row => row.id" |
| | | :pagination="mobilePagination" |
| | | class="sm:h-full" |
| | | /> |
| | | <JudgeOperateDrawer |
| | | v-model:visible="drawerVisible" |
| | | :operate-type="operateType" |
| | | :row-data="editingData" |
| | | @submitted="getDataByPage" |
| | | /> |
| | | </NCard> |
| | | class="flex-col-stretch card-wrapper sm:flex-1-hidden" |
| | | :content-style="{ flex: 1, overflow: 'hidden', display: 'flex', flexDirection: 'column' }" |
| | | > |
| | | <template #header-extra> |
| | | <TableHeaderOperation |
| | | v-model:columns="columnChecks" |
| | | :disabled-delete="checkedRowKeys.length === 0" |
| | | :loading="loading" |
| | | :show-add="hasAuth('qm:judge:add')" |
| | | :show-delete="hasAuth('qm:judge:remove')" |
| | | :show-export="hasAuth('qm:judge:export')" |
| | | @add="handleAdd" |
| | | @delete="handleBatchDelete" |
| | | @export="handleExport" |
| | | @refresh="getData" |
| | | /> |
| | | </template> |
| | | <NDataTable |
| | | v-model:checked-row-keys="checkedRowKeys" |
| | | :columns="columns" |
| | | :data="data" |
| | | size="small" |
| | | :flex-height="!appStore.isMobile" |
| | | :scroll-x="scrollX" |
| | | :loading="loading" |
| | | remote |
| | | :row-key="row => row.id" |
| | | :pagination="mobilePagination" |
| | | :row-props="handleRowClick" |
| | | class="flex-1-hidden" |
| | | /> |
| | | <JudgeOperateDrawer |
| | | v-model:visible="drawerVisible" |
| | | :operate-type="operateType" |
| | | :row-data="editingData" |
| | | @submitted="getDataByPage" |
| | | /> |
| | | </NCard> |
| | | <JudgeDetailsSubTable :judge-id="selectedJudgeId" class="sm:flex-1-hidden" /> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <style scoped></style> |
| | | <style scoped> |
| | | :deep(.n-data-table-th), |
| | | :deep(.n-data-table-td) { |
| | | padding: 4px 6px; |
| | | overflow: hidden; |
| | | } |
| | | </style> |
| | |
| | | <script setup lang="ts"> |
| | | import { computed, onMounted, ref, watch } from 'vue'; |
| | | import { computed, ref, watch } from 'vue'; |
| | | import type { SelectOption } from 'naive-ui'; |
| | | import { NSelect } from 'naive-ui'; |
| | | import { jsonClone } from '@sa/utils'; |
| | | import { fetchCreateJudge, fetchUpdateJudge } from '@/service/api/qm/judge'; |
| | | import { fetchGetStdList } from '@/service/api/qm/std'; |
| | | import { fetchGetMatList } from '@/service/api/md/mat'; |
| | | import { useFormRules, useNaiveForm } from '@/hooks/common/form'; |
| | | import { $t } from '@/locales'; |
| | | |
| | |
| | | ]; |
| | | |
| | | const stdOptions = ref<SelectOption[]>([]); |
| | | const matOptions = ref<SelectOption[]>([]); |
| | | |
| | | type Model = Api.Qm.JudgeOperateParams; |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | async function fetchMatOptions() { |
| | | if (model.value.category === 1) { |
| | | matOptions.value = []; |
| | | return; |
| | | } |
| | | const { data } = await fetchGetMatList({ tid: 1, pageSize: 1000 }); |
| | | if (data) { |
| | | matOptions.value = data.rows.map(item => ({ |
| | | label: item.name, |
| | | value: item.code |
| | | })); |
| | | } |
| | | } |
| | | |
| | | async function handleSubmit() { |
| | | await validate(); |
| | | |
| | |
| | | emit('submitted'); |
| | | } |
| | | |
| | | watch(visible, () => { |
| | | watch(visible, async () => { |
| | | if (visible.value) { |
| | | handleUpdateModelWhenEdit(); |
| | | restoreValidation(); |
| | | |
| | | // Fetch stdOptions when the drawer becomes visible |
| | | fetchStdOptions(); |
| | | await fetchStdOptions(); |
| | | await fetchMatOptions(); |
| | | } |
| | | }); |
| | | |
| | | watch( |
| | | () => model.value.category, |
| | | () => { |
| | | async () => { |
| | | fetchStdOptions(); |
| | | model.value.matName = ''; |
| | | model.value.matCode = ''; |
| | | await fetchMatOptions(); |
| | | } |
| | | ); |
| | | |
| | | watch( |
| | | () => model.value.matCode, |
| | | val => { |
| | | if (val) { |
| | | const selectedOption = matOptions.value.find(opt => opt.value === val); |
| | | if (selectedOption && typeof selectedOption.label === 'string') { |
| | | const name = selectedOption.label as string; |
| | | model.value.matName = name; |
| | | model.value.judgeName = name; |
| | | } |
| | | } else { |
| | | model.value.matName = ''; |
| | | } |
| | | } |
| | | ); |
| | | </script> |
| | |
| | | <NFormItem label="å¤å®åç§°" path="judgeName"> |
| | | <NInput v-model:value="model.judgeName" placeholder="请è¾å
¥å¤å®åç§°" /> |
| | | </NFormItem> |
| | | <NFormItem label="ç©æçå·ä»£ç " path="matCode"> |
| | | <NInput v-model:value="model.matCode" placeholder="请è¾å
¥ç©æçå·ä»£ç " /> |
| | | </NFormItem> |
| | | <NFormItem label="ç©æçå·" path="matName"> |
| | | <NInput v-model:value="model.matName" placeholder="请è¾å
¥ç©æçå·" /> |
| | | </NFormItem> |
| | | <NFormItem label="ç©æç±»å" path="category"> |
| | | <NSelect v-model:value="model.category" :options="categoryOptions" placeholder="è¯·éæ©ç©æç±»å" /> |
| | | </NFormItem> |
| | | <NFormItem label="ç©æçå·" path="matName"> |
| | | <NSelect |
| | | v-model:value="model.matCode" |
| | | :options="matOptions" |
| | | placeholder="è¯·éæ©ç©æçå·" |
| | | :disabled="model.category === 1" |
| | | /> |
| | | </NFormItem> |
| | | <NFormItem label="ç¶æ" path="status"> |
| | | <NSelect v-model:value="model.status" :options="statusOptions" placeholder="è¯·éæ©ç¶æ" /> |
| | | </NFormItem> |
| | |
| | | <script setup lang="ts"> |
| | | import { toRaw } from 'vue'; |
| | | import { onMounted, ref, toRaw, watch } from 'vue'; |
| | | import { jsonClone } from '@sa/utils'; |
| | | import { fetchGetMatList } from '@/service/api/md/mat'; |
| | | import { useNaiveForm } from '@/hooks/common/form'; |
| | | import { $t } from '@/locales'; |
| | | |
| | |
| | | const model = defineModel<Api.Qm.JudgeSearchParams>('model', { required: true }); |
| | | |
| | | const defaultModel = jsonClone(toRaw(model.value)); |
| | | |
| | | const matOptions = ref<CommonType.Option[]>([]); |
| | | |
| | | async function getMatOptions() { |
| | | if (model.value.category !== 0) { |
| | | matOptions.value = []; |
| | | model.value.matName = null; |
| | | model.value.matCode = null; |
| | | return; |
| | | } |
| | | const { data } = await fetchGetMatList({ tid: 1, pageSize: 1000 }); |
| | | if (data) { |
| | | matOptions.value = data.rows.map(item => ({ |
| | | label: item.name, |
| | | value: item.code |
| | | })); |
| | | } |
| | | } |
| | | |
| | | watch( |
| | | () => model.value.category, |
| | | newVal => { |
| | | if (newVal === 0) { |
| | | getMatOptions(); |
| | | } else { |
| | | matOptions.value = []; |
| | | model.value.matName = null; |
| | | model.value.matCode = null; |
| | | } |
| | | } |
| | | ); |
| | | |
| | | onMounted(() => { |
| | | if (model.value.category === 0) { |
| | | getMatOptions(); |
| | | } |
| | | }); |
| | | |
| | | function resetModel() { |
| | | Object.assign(model.value, defaultModel); |
| | |
| | | /> |
| | | </NFormItemGi> |
| | | |
| | | <NFormItemGi span="24 s:12 m:6" label="ç©æçå·ä»£ç " label-width="auto" path="matCode" class="pr-24px"> |
| | | <NInput v-model:value="model.matCode" placeholder="请è¾å
¥ç©æçå·ä»£ç " /> |
| | | </NFormItemGi> |
| | | <NFormItemGi span="24 s:12 m:6" label="ç©æçå·" label-width="auto" path="matName" class="pr-24px"> |
| | | <NInput v-model:value="model.matName" placeholder="请è¾å
¥ç©æçå·" /> |
| | | <NFormItemGi span="24 s:12 m:6" label="ç©æçå·" label-width="auto" path="matCode" class="pr-24px"> |
| | | <NSelect |
| | | v-model:value="model.matCode" |
| | | :options="matOptions" |
| | | placeholder="è¯·éæ©ç©æçå·" |
| | | :disabled="model.category !== 0" |
| | | clearable |
| | | filterable |
| | | /> |
| | | </NFormItemGi> |
| | | <NFormItemGi span="24 s:12 m:6" label="å¤å®åç§°" label-width="auto" path="judgeName" class="pr-24px"> |
| | | <NInput v-model:value="model.judgeName" placeholder="请è¾å
¥å¤å®åç§°" /> |