feat(moudule(qa)): 新增喂丝机对应关系、第三方储丝柜信息视图等管理界面
| | |
| | | - 1.æ°å¢æåæ£ æ£éªæ¹æ¬¡ 管çé¡µé¢ |
| | | - 2.æ°æ®åºè¡¨ï¼ qm_batch |
| | | ``` |
| | | -- å建æ£éªæ¹æ¬¡è¡¨ |
| | | CREATE TABLE QM_BATCH ( |
| | | ID VARCHAR(50) NOT NULL, |
| | | BATCH_CODE VARCHAR(50), |
| | | BATCH_NAME VARCHAR(50), |
| | | TYP VARCHAR(20), |
| | | EQP_CODE VARCHAR(50), |
| | | MAT_CODE VARCHAR(50), |
| | | JUDGE_CODE VARCHAR(50), |
| | | BATCH_DATE DATE, |
| | | ISFLAG VARCHAR(2), |
| | | ENABLED VARCHAR(2), |
| | | TOTAL_NUM NUMERIC(22), |
| | | RESULTS VARCHAR(50), |
| | | APPROVER VARCHAR(50), |
| | | AUDITOR VARCHAR(50), |
| | | CREATER VARCHAR(50), |
| | | TAB_DATE DATE, |
| | | VER_NAME VARCHAR(50), |
| | | VER_CODE VARCHAR(50), |
| | | ARCH_DATE VARCHAR(50), |
| | | FLAG VARCHAR(20), |
| | | TO_MES_DATE DATE, |
| | | FROM_MES_DATE DATE, |
| | | DELETED NUMERIC(22), |
| | | BATCH_DES VARCHAR(200), |
| | | CATEGORY VARCHAR(2), |
| | | MAKENO VARCHAR(60), |
| | | SHIFTEQPNO VARCHAR(32), |
| | | BOXNO VARCHAR(60), |
| | | PID VARCHAR(50), |
| | | REVIEWER VARCHAR(50), |
| | | RVCOUNT NUMERIC(22), |
| | | STATE VARCHAR(2), |
| | | REVIEW_TIME DATE, |
| | | AUDIT_TIME DATE, |
| | | SPEC VARCHAR(50), |
| | | APPROVE_TIME DATE, |
| | | UNIT VARCHAR(50), |
| | | ARRIVAL_TIME DATE, |
| | | STORAGE_PLACE VARCHAR(50), |
| | | CHECKER VARCHAR(20), |
| | | RECEIVE_TIME DATE, |
| | | INSP_TIME DATE, |
| | | STORER VARCHAR(50), |
| | | ISVERIFY VARCHAR(10), |
| | | ISCHK VARCHAR(10), |
| | | BAK1 VARCHAR(100), |
| | | BAK2 VARCHAR(100), |
| | | CONSTRAINT PK_QM_BATCH PRIMARY KEY (ID) |
| | | ); |
| | | |
| | | -- æ·»å æ³¨éï¼å¯éï¼ |
| | | COMMENT ON TABLE QM_BATCH IS 'æ£éªæ¹æ¬¡è¡¨'; |
| | | |
| | | COMMENT ON COLUMN QM_BATCH.ID IS 'ç¼ç '; |
| | | COMMENT ON COLUMN QM_BATCH.BATCH_CODE IS 'æ¹æ¬¡ä»£ç '; |
| | | COMMENT ON COLUMN QM_BATCH.BATCH_NAME IS 'æ¹æ¬¡åç§°'; |
| | | COMMENT ON COLUMN QM_BATCH.TYP IS 'A-å¶ä¸ B-æå C-å·å
D-å°ç®± E-ç³é¦æ'; |
| | | COMMENT ON COLUMN QM_BATCH.EQP_CODE IS 'æºå°ä»£ç '; |
| | | COMMENT ON COLUMN QM_BATCH.MAT_CODE IS 'çå·'; |
| | | COMMENT ON COLUMN QM_BATCH.JUDGE_CODE IS 'å¤å®ä¾æ®ä»£ç '; |
| | | COMMENT ON COLUMN QM_BATCH.BATCH_DATE IS 'æ¹æ¬¡çææ¥æ'; |
| | | COMMENT ON COLUMN QM_BATCH.ISFLAG IS 'ä½¿ç¨æ å¿'; |
| | | COMMENT ON COLUMN QM_BATCH.ENABLED IS 'å¯ç¨æ å¿'; |
| | | COMMENT ON COLUMN QM_BATCH.TOTAL_NUM IS 'å°è´§æ»é'; |
| | | COMMENT ON COLUMN QM_BATCH.RESULTS IS '综åå¤å®'; |
| | | COMMENT ON COLUMN QM_BATCH.APPROVER IS 'æ¹å人'; |
| | | COMMENT ON COLUMN QM_BATCH.AUDITOR IS 'å®¡æ ¸äºº'; |
| | | COMMENT ON COLUMN QM_BATCH.CREATER IS 'å建人'; |
| | | COMMENT ON COLUMN QM_BATCH.TAB_DATE IS 'å¶è¡¨æ¥æ'; |
| | | COMMENT ON COLUMN QM_BATCH.VER_NAME IS 'çæ¬åç§°'; |
| | | COMMENT ON COLUMN QM_BATCH.VER_CODE IS 'çæ¬ç¼å·'; |
| | | COMMENT ON COLUMN QM_BATCH.ARCH_DATE IS 'ä¿åæ'; |
| | | COMMENT ON COLUMN QM_BATCH.FLAG IS '0-æªä¸ä¼ mes,1-å·²ä¸ä¼ , 3-ä»MESä¸è½½'; |
| | | COMMENT ON COLUMN QM_BATCH.TO_MES_DATE IS 'ä¸ä¼ MESæ¶é´'; |
| | | COMMENT ON COLUMN QM_BATCH.FROM_MES_DATE IS 'ä»MESæ¶é´ä¸è½½'; |
| | | COMMENT ON COLUMN QM_BATCH.DELETED IS 'å 餿 å¿'; |
| | | COMMENT ON COLUMN QM_BATCH.BATCH_DES IS 'æ¹æ¬¡æè¿°'; |
| | | COMMENT ON COLUMN QM_BATCH.CATEGORY IS 'ç±»å« 0ï¼æå 1ï¼è¾
æ'; |
| | | COMMENT ON COLUMN QM_BATCH.MAKENO IS 'å·å¶å·¥å·'; |
| | | COMMENT ON COLUMN QM_BATCH.SHIFTEQPNO IS 'çæ¬¡æºå·'; |
| | | COMMENT ON COLUMN QM_BATCH.BOXNO IS 'è£
ç®±å·'; |
| | | COMMENT ON COLUMN QM_BATCH.PID IS 'ç¶æ¹æ¬¡å·'; |
| | | COMMENT ON COLUMN QM_BATCH.REVIEWER IS '夿 ¸äºº'; |
| | | COMMENT ON COLUMN QM_BATCH.RVCOUNT IS '夿£æ¬¡æ°'; |
| | | COMMENT ON COLUMN QM_BATCH.STATE IS 'æ¹æ¬¡ç¶æ'; |
| | | COMMENT ON COLUMN QM_BATCH.REVIEW_TIME IS '夿 ¸æ¥æ'; |
| | | COMMENT ON COLUMN QM_BATCH.AUDIT_TIME IS 'å®¡æ ¸æ¥æ'; |
| | | COMMENT ON COLUMN QM_BATCH.SPEC IS 'è§æ ¼'; |
| | | COMMENT ON COLUMN QM_BATCH.APPROVE_TIME IS 'æ¹åæ¶é´'; |
| | | COMMENT ON COLUMN QM_BATCH.UNIT IS 'å°è´§åä½'; |
| | | COMMENT ON COLUMN QM_BATCH.ARRIVAL_TIME IS 'å°è´§æ¥æ'; |
| | | COMMENT ON COLUMN QM_BATCH.STORAGE_PLACE IS 'åæ¾å°ç¹'; |
| | | COMMENT ON COLUMN QM_BATCH.CHECKER IS 'æ£éªå'; |
| | | COMMENT ON COLUMN QM_BATCH.RECEIVE_TIME IS 'æ¥åæ¥æ'; |
| | | COMMENT ON COLUMN QM_BATCH.INSP_TIME IS 'æ¥æ£æ¥æ'; |
| | | COMMENT ON COLUMN QM_BATCH.STORER IS 'ä»åºä¿ç®¡å'; |
| | | COMMENT ON COLUMN QM_BATCH.ISVERIFY IS 'æ¯å¦éªè¯'; |
| | | COMMENT ON COLUMN QM_BATCH.ISCHK IS 'æ¯å¦æ£éª'; |
| | | COMMENT ON COLUMN QM_BATCH.BAK1 IS 'å¤ç¨1'; |
| | | COMMENT ON COLUMN QM_BATCH.BAK2 IS 'å¤ç¨2'; |
| | | |
| | | -- å建索å¼ï¼æ ¹æ®å¸¸ç¨æ¥è¯¢æ¡ä»¶åå»ºï¼ |
| | | CREATE INDEX IDX_QM_BATCH_BATCH_CODE ON QM_BATCH(BATCH_CODE); |
| | | CREATE INDEX IDX_QM_BATCH_BATCH_DATE ON QM_BATCH(BATCH_DATE); |
| | | CREATE INDEX IDX_QM_BATCH_TYP ON QM_BATCH(TYP); |
| | | CREATE INDEX IDX_QM_BATCH_MAT_CODE ON QM_BATCH(MAT_CODE); |
| | | ``` |
| | | |
| | | #### 20260302 |
| | | - å¾
åäºé¡¹ |
| | | - [ ] ç®åå¨ä¸æä¿¡æ¯ä¿¡æ¯æ²¡æä»è§å¾ä¸è·åï¼ä½¿ç¨oracle_store_silk表模æ |
| | | |
| | |
| | | "social-callback": () => import("@/views/_builtin/social-callback/index.vue"), |
| | | "user-center": () => import("@/views/_builtin/user-center/index.vue"), |
| | | about: () => import("@/views/about/index.vue"), |
| | | "analy_feed-match": () => import("@/views/analy/feed-match/index.vue"), |
| | | analy_hoister: () => import("@/views/analy/hoister/index.vue"), |
| | | "analy_output-analy": () => import("@/views/analy/output-analy/index.vue"), |
| | | analy_packer: () => import("@/views/analy/packer/index.vue"), |
| | | analy_roller: () => import("@/views/analy/roller/index.vue"), |
| | | "analy_store-silk": () => import("@/views/analy/store-silk/index.vue"), |
| | | demo_demo: () => import("@/views/demo/demo/index.vue"), |
| | | demo_tree: () => import("@/views/demo/tree/index.vue"), |
| | | home: () => import("@/views/home/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"), |
| | | monitor_online: () => import("@/views/monitor/online/index.vue"), |
| | |
| | | }, |
| | | children: [ |
| | | { |
| | | name: 'analy_feed-match', |
| | | path: '/analy/feed-match', |
| | | component: 'view.analy_feed-match', |
| | | meta: { |
| | | title: 'analy_feed-match', |
| | | i18nKey: 'route.analy_feed-match' |
| | | } |
| | | }, |
| | | { |
| | | name: 'analy_hoister', |
| | | path: '/analy/hoister', |
| | | component: 'view.analy_hoister', |
| | |
| | | meta: { |
| | | title: 'analy_roller', |
| | | i18nKey: 'route.analy_roller' |
| | | } |
| | | }, |
| | | { |
| | | name: 'analy_store-silk', |
| | | path: '/analy/store-silk', |
| | | component: 'view.analy_store-silk', |
| | | meta: { |
| | | title: 'analy_store-silk', |
| | | i18nKey: 'route.analy_store-silk' |
| | | } |
| | | } |
| | | ] |
| | |
| | | } |
| | | }, |
| | | { |
| | | name: 'md', |
| | | path: '/md', |
| | | component: 'layout.base', |
| | | meta: { |
| | | title: 'md', |
| | | i18nKey: 'route.md' |
| | | }, |
| | | children: [ |
| | | { |
| | | name: 'md_shift', |
| | | path: '/md/shift', |
| | | component: 'view.md_shift', |
| | | meta: { |
| | | title: 'md_shift', |
| | | i18nKey: 'route.md_shift' |
| | | } |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | name: 'monitor', |
| | | path: '/monitor', |
| | | component: 'layout.base', |
| | |
| | | "500": "/500", |
| | | "about": "/about", |
| | | "analy": "/analy", |
| | | "analy_feed-match": "/analy/feed-match", |
| | | "analy_hoister": "/analy/hoister", |
| | | "analy_output-analy": "/analy/output-analy", |
| | | "analy_packer": "/analy/packer", |
| | | "analy_roller": "/analy/roller", |
| | | "analy_store-silk": "/analy/store-silk", |
| | | "demo": "/demo", |
| | | "demo_demo": "/demo/demo", |
| | | "demo_tree": "/demo/tree", |
| | | "home": "/home", |
| | | "iframe-page": "/iframe-page/:url", |
| | | "login": "/login/:module(pwd-login|code-login|register|reset-pwd|bind-wechat)?", |
| | | "md": "/md", |
| | | "md_shift": "/md/shift", |
| | | "monitor": "/monitor", |
| | | "monitor_cache": "/monitor/cache", |
| | | "monitor_logininfor": "/monitor/logininfor", |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { request } from '@/service/request'; |
| | | |
| | | /** è·åå䏿ºå¯¹åºå
³ç³»å表 */ |
| | | export function fetchGetFeedMatchList (params?: Api.Analy.FeedMatchSearchParams) { |
| | | return request<Api.Analy.FeedMatchList>({ |
| | | url: '/analy/feedMatch/list', |
| | | method: 'get', |
| | | params |
| | | }); |
| | | } |
| | | /** æ°å¢å䏿ºå¯¹åºå
³ç³» */ |
| | | export function fetchCreateFeedMatch (data: Api.Analy.FeedMatchOperateParams) { |
| | | return request<boolean>({ |
| | | url: '/analy/feedMatch', |
| | | method: 'post', |
| | | data |
| | | }); |
| | | } |
| | | |
| | | /** ä¿®æ¹å䏿ºå¯¹åºå
³ç³» */ |
| | | export function fetchUpdateFeedMatch (data: Api.Analy.FeedMatchOperateParams) { |
| | | return request<boolean>({ |
| | | url: '/analy/feedMatch', |
| | | method: 'put', |
| | | data |
| | | }); |
| | | } |
| | | |
| | | /** æ¹éå é¤å䏿ºå¯¹åºå
³ç³» */ |
| | | export function fetchBatchDeleteFeedMatch (times: CommonType.IdType[]) { |
| | | return request<boolean>({ |
| | | url: `/analy/feedMatch/${times.join(',')}`, |
| | | method: 'delete' |
| | | }); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { request } from '@/service/request'; |
| | | |
| | | /** è·åå¨ä¸æäº§éå表 */ |
| | | export function fetchGetStoreSilkList (params?: Api.Analy.StoreSilkSearchParams) { |
| | | return request<Api.Analy.StoreSilkList>({ |
| | | url: '/analy/storeSilk/list', |
| | | method: 'get', |
| | | params |
| | | }); |
| | | } |
| | | /** æ°å¢å¨ä¸æäº§é */ |
| | | export function fetchCreateStoreSilk (data: Api.Analy.StoreSilkOperateParams) { |
| | | return request<boolean>({ |
| | | url: '/analy/storeSilk', |
| | | method: 'post', |
| | | data |
| | | }); |
| | | } |
| | | |
| | | /** ä¿®æ¹å¨ä¸æäº§é */ |
| | | export function fetchUpdateStoreSilk (data: Api.Analy.StoreSilkOperateParams) { |
| | | return request<boolean>({ |
| | | url: '/analy/storeSilk', |
| | | method: 'put', |
| | | data |
| | | }); |
| | | } |
| | | |
| | | /** æ¹éå é¤å¨ä¸æäº§é */ |
| | | export function fetchBatchDeleteStoreSilk (ids: CommonType.IdType[]) { |
| | | return request<boolean>({ |
| | | url: `/analy/storeSilk/${ids.join(',')}`, |
| | | method: 'delete' |
| | | }); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { request } from '@/service/request'; |
| | | |
| | | /** è·åçæ¬¡å表 */ |
| | | export function fetchGetShiftList (params?: Api.Md.ShiftSearchParams) { |
| | | return request<Api.Md.ShiftList>({ |
| | | url: '/md/shift/list', |
| | | method: 'get', |
| | | params |
| | | }); |
| | | } |
| | | /** æ°å¢ç次 */ |
| | | export function fetchCreateShift (data: Api.Md.ShiftOperateParams) { |
| | | return request<boolean>({ |
| | | url: '/md/shift', |
| | | method: 'post', |
| | | data |
| | | }); |
| | | } |
| | | |
| | | /** ä¿®æ¹ç次 */ |
| | | export function fetchUpdateShift (data: Api.Md.ShiftOperateParams) { |
| | | return request<boolean>({ |
| | | url: '/md/shift', |
| | | method: 'put', |
| | | data |
| | | }); |
| | | } |
| | | |
| | | /** æ¹éå é¤ç次 */ |
| | | export function fetchBatchDeleteShift (ids: CommonType.IdType[]) { |
| | | return request<boolean>({ |
| | | url: `/md/shift/${ids.join(',')}`, |
| | | method: 'delete' |
| | | }); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * Namespace Api |
| | | * |
| | | * All backend api type |
| | | */ |
| | | declare namespace Api { |
| | | /** |
| | | * namespace Analy |
| | | * |
| | | * backend api module: "Analy" |
| | | */ |
| | | namespace Analy { |
| | | /** feed match */ |
| | | type FeedMatch = Common.CommonRecord<{ |
| | | /** æ¶é´æ³ */ |
| | | time: string; |
| | | /** çæ¬¡+æºå° */ |
| | | key: string; |
| | | /** æ°æ®æ´æ°æ¶é´ */ |
| | | dacUpTime: string; |
| | | /** 1#å䏿ºå¯¹åºç第ä¸ä¸ªå¨ä¸æ */ |
| | | fs11: string; |
| | | /** 1#å䏿ºå¯¹åºç第äºä¸ªå¨ä¸æ */ |
| | | fs12: string; |
| | | /** 2#å䏿ºå¯¹åºç第ä¸ä¸ªå¨ä¸æ */ |
| | | fs21: string; |
| | | /** 2#å䏿ºå¯¹åºç第äºä¸ªå¨ä¸æ */ |
| | | fs22: string; |
| | | /** 3#å䏿ºå¯¹åºç第ä¸ä¸ªå¨ä¸æ */ |
| | | fs31: string; |
| | | /** 3#å䏿ºå¯¹åºç第äºä¸ªå¨ä¸æ */ |
| | | fs32: string; |
| | | /** 4#å䏿ºå¯¹åºç第ä¸ä¸ªå¨ä¸æ */ |
| | | fs41: string; |
| | | /** 4#å䏿ºå¯¹åºç第äºä¸ªå¨ä¸æ */ |
| | | fs42: string; |
| | | /** 1#æºç»å¯¹åºçå䏿ºå管é */ |
| | | pipe01: number; |
| | | /** 2#æºç»å¯¹åºçå䏿ºå管é */ |
| | | pipe02: number; |
| | | /** 3#æºç»å¯¹åºçå䏿ºå管é */ |
| | | pipe03: number; |
| | | /** 4#æºç»å¯¹åºçå䏿ºå管é */ |
| | | pipe04: number; |
| | | /** 5#æºç»å¯¹åºçå䏿ºå管é */ |
| | | pipe05: number; |
| | | /** 6#æºç»å¯¹åºçå䏿ºå管é */ |
| | | pipe06: number; |
| | | /** 7#æºç»å¯¹åºçå䏿ºå管é */ |
| | | pipe07: number; |
| | | /** 8#æºç»å¯¹åºçå䏿ºå管é */ |
| | | pipe08: number; |
| | | /** 9#æºç»å¯¹åºçå䏿ºå管é */ |
| | | pipe09: number; |
| | | /** 10#æºç»å¯¹åºçå䏿ºå管é */ |
| | | pipe10: number; |
| | | /** 11#æºç»å¯¹åºçå䏿ºå管é */ |
| | | pipe11: number; |
| | | /** 12#æºç»å¯¹åºçå䏿ºå管é */ |
| | | pipe12: number; |
| | | /** å䏿ºç¶æ 1-è¿æ¥ 0-æå¼ */ |
| | | wsjState: number; |
| | | /** çæ¬¡ */ |
| | | shift: number; |
| | | /** æºå° */ |
| | | equNo: number; |
| | | /** 夿³¨ */ |
| | | remark: string; |
| | | }>; |
| | | |
| | | /** feed match search params */ |
| | | type FeedMatchSearchParams = CommonType.RecordNullable< |
| | | Pick< |
| | | Api.Analy.FeedMatch, |
| | | | 'time' |
| | | | 'key' |
| | | > & |
| | | Api.Common.CommonSearchParams |
| | | >; |
| | | |
| | | /** feed match operate params */ |
| | | type FeedMatchOperateParams = CommonType.RecordNullable< |
| | | Pick< |
| | | Api.Analy.FeedMatch, |
| | | | 'time' |
| | | | 'key' |
| | | | 'dacUpTime' |
| | | | 'fs11' |
| | | | 'fs12' |
| | | | 'fs21' |
| | | | 'fs22' |
| | | | 'fs31' |
| | | | 'fs32' |
| | | | 'fs41' |
| | | | 'fs42' |
| | | | 'pipe01' |
| | | | 'pipe02' |
| | | | 'pipe03' |
| | | | 'pipe04' |
| | | | 'pipe05' |
| | | | 'pipe06' |
| | | | 'pipe07' |
| | | | 'pipe08' |
| | | | 'pipe09' |
| | | | 'pipe10' |
| | | | 'pipe11' |
| | | | 'pipe12' |
| | | | 'wsjState' |
| | | | 'shift' |
| | | | 'equNo' |
| | | | 'remark' |
| | | > |
| | | >; |
| | | |
| | | /** feed match list */ |
| | | type FeedMatchList = Api.Common.PaginatingQueryRecord<FeedMatch>; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * Namespace Api |
| | | * |
| | | * All backend api type |
| | | */ |
| | | declare namespace Api { |
| | | /** |
| | | * namespace Analy |
| | | * |
| | | * backend api module: "Analy" |
| | | */ |
| | | namespace Analy { |
| | | /** store silk */ |
| | | type StoreSilk = Common.CommonRecord<{ |
| | | /** id */ |
| | | id: CommonType.IdType; |
| | | /** çå· */ |
| | | materialname: string; |
| | | /** æ¹æ¬¡å· */ |
| | | batchcode: string; |
| | | /** æææ¥æ */ |
| | | actualstarttime: string; |
| | | /** ææéé */ |
| | | jobinput: number; |
| | | /** æèéé */ |
| | | weightloss: number; |
| | | /** åºå¶ä¸ç */ |
| | | slkrate: number; |
| | | /** å¨ä¸æéé */ |
| | | weight: number; |
| | | /** å¨ä¸æåºæå¼å§æ¶é´ */ |
| | | distimebegin: string; |
| | | /** å¨ä¸æåºæç»ææ¶é´ */ |
| | | distimeend: string; |
| | | /** æåå·(æ«ä½) */ |
| | | siloid: CommonType.IdType; |
| | | }>; |
| | | |
| | | /** store silk search params */ |
| | | type StoreSilkSearchParams = CommonType.RecordNullable< |
| | | Pick< |
| | | Api.Analy.StoreSilk, |
| | | | 'materialname' |
| | | | 'batchcode' |
| | | | 'actualstarttime' |
| | | | 'distimebegin' |
| | | | 'distimeend' |
| | | | 'siloid' |
| | | > & |
| | | Api.Common.CommonSearchParams |
| | | >; |
| | | |
| | | /** store silk operate params */ |
| | | type StoreSilkOperateParams = CommonType.RecordNullable< |
| | | Pick< |
| | | Api.Analy.StoreSilk, |
| | | | 'id' |
| | | | 'materialname' |
| | | | 'batchcode' |
| | | | 'actualstarttime' |
| | | | 'jobinput' |
| | | | 'weightloss' |
| | | | 'slkrate' |
| | | | 'weight' |
| | | | 'distimebegin' |
| | | | 'distimeend' |
| | | | 'siloid' |
| | | > |
| | | >; |
| | | |
| | | /** store silk list */ |
| | | type StoreSilkList = Api.Common.PaginatingQueryRecord<StoreSilk>; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * Namespace Api |
| | | * |
| | | * All backend api type |
| | | */ |
| | | declare namespace Api { |
| | | /** |
| | | * namespace Md |
| | | * |
| | | * backend api module: "Md" |
| | | */ |
| | | namespace Md { |
| | | /** shift */ |
| | | type Shift = Common.CommonRecord<{ |
| | | /** ud */ |
| | | id: CommonType.IdType; |
| | | /** 车é´å¤é® */ |
| | | wsId: CommonType.IdType; |
| | | /** ç¼ç */ |
| | | code: string; |
| | | /** åç§° */ |
| | | name: string; |
| | | /** çæ¬¡å¼å§æ¶é´ */ |
| | | stim: string; |
| | | /** çæ¬¡ç»ææ¶é´ */ |
| | | etim: string; |
| | | /** æåº */ |
| | | seq: number; |
| | | /** å¯ç¨ */ |
| | | enable: number; |
| | | /** å é¤ */ |
| | | del: number; |
| | | /** åå»ºç¨æ· */ |
| | | createUserName: string; |
| | | /** å建æ¶é´ */ |
| | | createUserTime: string; |
| | | /** æ´æ°ç¨æ· */ |
| | | updateUserName: string; |
| | | /** æ´æ°æ¶é´ */ |
| | | updateUserTime: string; |
| | | }>; |
| | | |
| | | /** shift search params */ |
| | | type ShiftSearchParams = CommonType.RecordNullable< |
| | | Pick< |
| | | Api.Md.Shift, |
| | | | 'code' |
| | | | 'name' |
| | | | 'enable' |
| | | > & |
| | | Api.Common.CommonSearchParams |
| | | >; |
| | | |
| | | /** shift operate params */ |
| | | type ShiftOperateParams = CommonType.RecordNullable< |
| | | Pick< |
| | | Api.Md.Shift, |
| | | | 'id' |
| | | | 'wsId' |
| | | | 'code' |
| | | | 'name' |
| | | | 'stim' |
| | | | 'etim' |
| | | | 'seq' |
| | | | 'enable' |
| | | | 'del' |
| | | | 'createUserName' |
| | | | 'createUserTime' |
| | | | 'updateUserName' |
| | | | 'updateUserTime' |
| | | > |
| | | >; |
| | | |
| | | /** shift list */ |
| | | type ShiftList = Api.Common.PaginatingQueryRecord<Shift>; |
| | | } |
| | | } |
| | |
| | | IconMdiGithub: typeof import('~icons/mdi/github')['default'] |
| | | IconMdiKeyboardEsc: typeof import('~icons/mdi/keyboard-esc')['default'] |
| | | IconMdiKeyboardReturn: typeof import('~icons/mdi/keyboard-return')['default'] |
| | | IconMdiTableLarge: typeof import('~icons/mdi/table-large')['default'] |
| | | IconQuillCollapse: typeof import('~icons/quill/collapse')['default'] |
| | | IconQuillExpand: typeof import('~icons/quill/expand')['default'] |
| | | IconSimpleIconsGitee: typeof import('~icons/simple-icons/gitee')['default'] |
| | |
| | | NBreadcrumb: typeof import('naive-ui')['NBreadcrumb'] |
| | | NBreadcrumbItem: typeof import('naive-ui')['NBreadcrumbItem'] |
| | | NButton: typeof import('naive-ui')['NButton'] |
| | | NButtonGroup: typeof import('naive-ui')['NButtonGroup'] |
| | | NCard: typeof import('naive-ui')['NCard'] |
| | | NCheckbox: typeof import('naive-ui')['NCheckbox'] |
| | | NCode: typeof import('naive-ui')['NCode'] |
| | |
| | | const IconMdiGithub: typeof import('~icons/mdi/github')['default'] |
| | | const IconMdiKeyboardEsc: typeof import('~icons/mdi/keyboard-esc')['default'] |
| | | const IconMdiKeyboardReturn: typeof import('~icons/mdi/keyboard-return')['default'] |
| | | const IconMdiTableLarge: typeof import('~icons/mdi/table-large')['default'] |
| | | const IconQuillCollapse: typeof import('~icons/quill/collapse')['default'] |
| | | const IconQuillExpand: typeof import('~icons/quill/expand')['default'] |
| | | const IconSimpleIconsGitee: typeof import('~icons/simple-icons/gitee')['default'] |
| | |
| | | const NBreadcrumb: typeof import('naive-ui')['NBreadcrumb'] |
| | | const NBreadcrumbItem: typeof import('naive-ui')['NBreadcrumbItem'] |
| | | const NButton: typeof import('naive-ui')['NButton'] |
| | | const NButtonGroup: typeof import('naive-ui')['NButtonGroup'] |
| | | const NCard: typeof import('naive-ui')['NCard'] |
| | | const NCheckbox: typeof import('naive-ui')['NCheckbox'] |
| | | const NCode: typeof import('naive-ui')['NCode'] |
| | |
| | | "500": "/500"; |
| | | "about": "/about"; |
| | | "analy": "/analy"; |
| | | "analy_feed-match": "/analy/feed-match"; |
| | | "analy_hoister": "/analy/hoister"; |
| | | "analy_output-analy": "/analy/output-analy"; |
| | | "analy_packer": "/analy/packer"; |
| | | "analy_roller": "/analy/roller"; |
| | | "analy_store-silk": "/analy/store-silk"; |
| | | "demo": "/demo"; |
| | | "demo_demo": "/demo/demo"; |
| | | "demo_tree": "/demo/tree"; |
| | | "home": "/home"; |
| | | "iframe-page": "/iframe-page/:url"; |
| | | "login": "/login/:module(pwd-login|code-login|register|reset-pwd|bind-wechat)?"; |
| | | "md": "/md"; |
| | | "md_shift": "/md/shift"; |
| | | "monitor": "/monitor"; |
| | | "monitor_cache": "/monitor/cache"; |
| | | "monitor_logininfor": "/monitor/logininfor"; |
| | |
| | | | "home" |
| | | | "iframe-page" |
| | | | "login" |
| | | | "md" |
| | | | "monitor" |
| | | | "qm" |
| | | | "social-callback" |
| | |
| | | | "social-callback" |
| | | | "user-center" |
| | | | "about" |
| | | | "analy_feed-match" |
| | | | "analy_hoister" |
| | | | "analy_output-analy" |
| | | | "analy_packer" |
| | | | "analy_roller" |
| | | | "analy_store-silk" |
| | | | "demo_demo" |
| | | | "demo_tree" |
| | | | "home" |
| | | | "md_shift" |
| | | | "monitor_cache" |
| | | | "monitor_logininfor" |
| | | | "monitor_online" |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script setup lang="tsx"> |
| | | import { ref } from 'vue'; |
| | | import { NDivider } from 'naive-ui'; |
| | | import { fetchBatchDeleteFeedMatch, fetchGetFeedMatchList } from '@/service/api/analy/feed-match'; |
| | | 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 ButtonIcon from '@/components/custom/button-icon.vue'; |
| | | import FeedMatchOperateDrawer from './modules/feed-match-operate-drawer.vue'; |
| | | import FeedMatchSearch from './modules/feed-match-search.vue'; |
| | | |
| | | defineOptions({ |
| | | name: 'FeedMatchList' |
| | | }); |
| | | |
| | | |
| | | const appStore = useAppStore(); |
| | | const { download } = useDownload(); |
| | | const { hasAuth } = useAuth(); |
| | | |
| | | const searchParams = ref<Api.Analy.FeedMatchSearchParams>({ |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | time: null, |
| | | key: null, |
| | | params: {} |
| | | }); |
| | | |
| | | const { columns, columnChecks, data, getData, getDataByPage, loading, mobilePagination, scrollX } = |
| | | useNaivePaginatedTable({ |
| | | api: () => fetchGetFeedMatchList(searchParams.value), |
| | | transform: response => defaultTransform(response), |
| | | onPaginationParamsChange: params => { |
| | | searchParams.value.pageNum = params.page; |
| | | searchParams.value.pageSize = params.pageSize; |
| | | }, |
| | | columns: () => [ |
| | | { |
| | | type: 'selection', |
| | | align: 'center', |
| | | width: 48 |
| | | }, |
| | | { |
| | | key: 'index', |
| | | title: $t('common.index'), |
| | | align: 'center', |
| | | width: 64, |
| | | render: (_, index) => index + 1 |
| | | }, |
| | | { |
| | | key: 'time', |
| | | title: 'æ¶é´æ³', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'key', |
| | | title: 'çæ¬¡+æºå°', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'dacUpTime', |
| | | title: 'æ°æ®æ´æ°æ¶é´', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'fs11', |
| | | title: '1#å䏿ºå¯¹åºç第ä¸ä¸ªå¨ä¸æ', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'fs12', |
| | | title: '1#å䏿ºå¯¹åºç第äºä¸ªå¨ä¸æ', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'fs21', |
| | | title: '2#å䏿ºå¯¹åºç第ä¸ä¸ªå¨ä¸æ', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'fs22', |
| | | title: '2#å䏿ºå¯¹åºç第äºä¸ªå¨ä¸æ', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'fs31', |
| | | title: '3#å䏿ºå¯¹åºç第ä¸ä¸ªå¨ä¸æ', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'fs32', |
| | | title: '3#å䏿ºå¯¹åºç第äºä¸ªå¨ä¸æ', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'fs41', |
| | | title: '4#å䏿ºå¯¹åºç第ä¸ä¸ªå¨ä¸æ', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'fs42', |
| | | title: '4#å䏿ºå¯¹åºç第äºä¸ªå¨ä¸æ', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'pipe01', |
| | | title: '1#æºç»å¯¹åºçå䏿ºå管é', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'pipe02', |
| | | title: '2#æºç»å¯¹åºçå䏿ºå管é', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'pipe03', |
| | | title: '3#æºç»å¯¹åºçå䏿ºå管é', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'pipe04', |
| | | title: '4#æºç»å¯¹åºçå䏿ºå管é', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'pipe05', |
| | | title: '5#æºç»å¯¹åºçå䏿ºå管é', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'pipe06', |
| | | title: '6#æºç»å¯¹åºçå䏿ºå管é', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'pipe07', |
| | | title: '7#æºç»å¯¹åºçå䏿ºå管é', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'pipe08', |
| | | title: '8#æºç»å¯¹åºçå䏿ºå管é', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'pipe09', |
| | | title: '9#æºç»å¯¹åºçå䏿ºå管é', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'pipe10', |
| | | title: '10#æºç»å¯¹åºçå䏿ºå管é', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'pipe11', |
| | | title: '11#æºç»å¯¹åºçå䏿ºå管é', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'pipe12', |
| | | title: '12#æºç»å¯¹åºçå䏿ºå管é', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'wsjState', |
| | | title: 'å䏿ºç¶æ 1-è¿æ¥ 0-æå¼', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'shift', |
| | | title: 'çæ¬¡', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'equNo', |
| | | title: 'æºå°', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'remark', |
| | | title: '夿³¨', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'operate', |
| | | title: $t('common.operate'), |
| | | align: 'center', |
| | | width: 130, |
| | | render: row => { |
| | | const divider = () => { |
| | | if (!hasAuth('analy:feedMatch:edit') || !hasAuth('analy:feedMatch:remove')) { |
| | | return null; |
| | | } |
| | | return <NDivider vertical />; |
| | | }; |
| | | |
| | | const editBtn = () => { |
| | | if (!hasAuth('analy:feedMatch:edit')) { |
| | | return null; |
| | | } |
| | | return ( |
| | | <ButtonIcon |
| | | text |
| | | type="primary" |
| | | icon="material-symbols:drive-file-rename-outline-outline" |
| | | tooltipContent={$t('common.edit')} |
| | | onClick={() => edit(row.time)} |
| | | /> |
| | | ); |
| | | }; |
| | | |
| | | const deleteBtn = () => { |
| | | if (!hasAuth('analy:feedMatch:remove')) { |
| | | return null; |
| | | } |
| | | return ( |
| | | <ButtonIcon |
| | | text |
| | | type="error" |
| | | icon="material-symbols:delete-outline" |
| | | tooltipContent={$t('common.delete')} |
| | | popconfirmContent={$t('common.confirmDelete')} |
| | | onPositiveClick={() => handleDelete(row.time)} |
| | | /> |
| | | ); |
| | | }; |
| | | |
| | | return ( |
| | | <div class="flex-center gap-8px"> |
| | | {editBtn()} |
| | | {divider()} |
| | | {deleteBtn()} |
| | | </div> |
| | | ); |
| | | } |
| | | } |
| | | ] |
| | | }); |
| | | |
| | | const { drawerVisible, operateType, editingData, handleAdd, handleEdit, checkedRowKeys, onBatchDeleted, onDeleted } = |
| | | useTableOperate(data, 'time', getData); |
| | | |
| | | async function handleBatchDelete() { |
| | | // request |
| | | const { error } = await fetchBatchDeleteFeedMatch(checkedRowKeys.value); |
| | | if (error) return; |
| | | onBatchDeleted(); |
| | | } |
| | | |
| | | async function handleDelete(time: CommonType.IdType) { |
| | | // request |
| | | const { error } = await fetchBatchDeleteFeedMatch([time]); |
| | | if (error) return; |
| | | onDeleted(); |
| | | } |
| | | |
| | | function edit(time: CommonType.IdType) { |
| | | handleEdit(time); |
| | | } |
| | | |
| | | function handleExport() { |
| | | download('/analy/feedMatch/export', searchParams.value, `å䏿ºå¯¹åºå
³ç³»_${new Date().getTime()}.xlsx`); |
| | | } |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="min-h-500px flex-col-stretch gap-16px overflow-hidden lt-sm:overflow-auto"> |
| | | <FeedMatchSearch 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('analy:feedMatch:add')" |
| | | :show-delete="hasAuth('analy:feedMatch:remove')" |
| | | :show-export="hasAuth('analy:feedMatch: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.time" |
| | | :pagination="mobilePagination" |
| | | class="sm:h-full" |
| | | /> |
| | | <FeedMatchOperateDrawer |
| | | v-model:visible="drawerVisible" |
| | | :operate-type="operateType" |
| | | :row-data="editingData" |
| | | @submitted="getDataByPage" |
| | | /> |
| | | </NCard> |
| | | </div> |
| | | </template> |
| | | |
| | | <style scoped></style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script setup lang="ts"> |
| | | import { computed, ref, watch } from 'vue'; |
| | | import { jsonClone } from '@sa/utils'; |
| | | import { fetchCreateFeedMatch, fetchUpdateFeedMatch } from '@/service/api/analy/feed-match'; |
| | | import { useFormRules, useNaiveForm } from '@/hooks/common/form'; |
| | | import { $t } from '@/locales'; |
| | | |
| | | defineOptions({ |
| | | name: 'FeedMatchOperateDrawer' |
| | | }); |
| | | |
| | | interface Props { |
| | | /** the type of operation */ |
| | | operateType: NaiveUI.TableOperateType; |
| | | /** the edit row data */ |
| | | rowData?: Api.Analy.FeedMatch | null; |
| | | } |
| | | |
| | | const props = defineProps<Props>(); |
| | | |
| | | interface Emits { |
| | | (e: 'submitted'): void; |
| | | } |
| | | |
| | | const emit = defineEmits<Emits>(); |
| | | |
| | | const visible = defineModel<boolean>('visible', { |
| | | default: false |
| | | }); |
| | | |
| | | const { formRef, validate, restoreValidation } = useNaiveForm(); |
| | | const { createRequiredRule } = useFormRules(); |
| | | |
| | | const title = computed(() => { |
| | | const titles: Record<NaiveUI.TableOperateType, string> = { |
| | | add: 'æ°å¢å䏿ºå¯¹åºå
³ç³»', |
| | | edit: 'ç¼è¾å䏿ºå¯¹åºå
³ç³»' |
| | | }; |
| | | return titles[props.operateType]; |
| | | }); |
| | | |
| | | type Model = Api.Analy.FeedMatchOperateParams; |
| | | |
| | | const model = ref<Model>(createDefaultModel()); |
| | | |
| | | function createDefaultModel(): Model { |
| | | return { |
| | | time: null, |
| | | key: '', |
| | | dacUpTime: '', |
| | | fs11: '', |
| | | fs12: '', |
| | | fs21: '', |
| | | fs22: '', |
| | | fs31: '', |
| | | fs32: '', |
| | | fs41: '', |
| | | fs42: '', |
| | | pipe01: null, |
| | | pipe02: null, |
| | | pipe03: null, |
| | | pipe04: null, |
| | | pipe05: null, |
| | | pipe06: null, |
| | | pipe07: null, |
| | | pipe08: null, |
| | | pipe09: null, |
| | | pipe10: null, |
| | | pipe11: null, |
| | | pipe12: null, |
| | | wsjState: null, |
| | | shift: null, |
| | | equNo: null, |
| | | remark: '' |
| | | }; |
| | | } |
| | | |
| | | type RuleKey = Extract< |
| | | keyof Model, |
| | | | 'time' |
| | | | 'key' |
| | | >; |
| | | |
| | | const rules: Record<RuleKey, App.Global.FormRule> = { |
| | | time: createRequiredRule('æ¶é´æ³ä¸è½ä¸ºç©º'), |
| | | key: createRequiredRule('çæ¬¡+æºå°ä¸è½ä¸ºç©º'), |
| | | }; |
| | | |
| | | function handleUpdateModelWhenEdit() { |
| | | model.value = createDefaultModel(); |
| | | |
| | | if (props.operateType === 'edit' && props.rowData) { |
| | | Object.assign(model.value, jsonClone(props.rowData)); |
| | | } |
| | | } |
| | | |
| | | function closeDrawer() { |
| | | visible.value = false; |
| | | } |
| | | |
| | | async function handleSubmit() { |
| | | await validate(); |
| | | |
| | | const { time, key, dacUpTime, fs11, fs12, fs21, fs22, fs31, fs32, fs41, fs42, pipe01, pipe02, pipe03, pipe04, pipe05, pipe06, pipe07, pipe08, pipe09, pipe10, pipe11, pipe12, wsjState, shift, equNo, remark } = model.value; |
| | | |
| | | // request |
| | | if (props.operateType === 'add') { |
| | | const { error } = await fetchCreateFeedMatch({ time, key, dacUpTime, fs11, fs12, fs21, fs22, fs31, fs32, fs41, fs42, pipe01, pipe02, pipe03, pipe04, pipe05, pipe06, pipe07, pipe08, pipe09, pipe10, pipe11, pipe12, wsjState, shift, equNo, remark }); |
| | | if (error) return; |
| | | } |
| | | |
| | | if (props.operateType === 'edit') { |
| | | const { error } = await fetchUpdateFeedMatch({ time, key, dacUpTime, fs11, fs12, fs21, fs22, fs31, fs32, fs41, fs42, pipe01, pipe02, pipe03, pipe04, pipe05, pipe06, pipe07, pipe08, pipe09, pipe10, pipe11, pipe12, wsjState, shift, equNo, remark }); |
| | | if (error) return; |
| | | } |
| | | |
| | | window.$message?.success($t('common.updateSuccess')); |
| | | closeDrawer(); |
| | | emit('submitted'); |
| | | } |
| | | |
| | | watch(visible, () => { |
| | | if (visible.value) { |
| | | handleUpdateModelWhenEdit(); |
| | | restoreValidation(); |
| | | } |
| | | }); |
| | | </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="time"> |
| | | <NDatePicker |
| | | v-model:formatted-value="model.time" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | clearable |
| | | /> |
| | | </NFormItem> |
| | | <NFormItem label="çæ¬¡+æºå°" path="key"> |
| | | <NInput |
| | | v-model:value="model.key" |
| | | :rows="3" |
| | | type="textarea" |
| | | placeholder="请è¾å
¥ç次+æºå°" |
| | | /> |
| | | </NFormItem> |
| | | <NFormItem label="æ°æ®æ´æ°æ¶é´" path="dacUpTime"> |
| | | <NInput |
| | | v-model:value="model.dacUpTime" |
| | | :rows="3" |
| | | type="textarea" |
| | | placeholder="请è¾å
¥æ°æ®æ´æ°æ¶é´" |
| | | /> |
| | | </NFormItem> |
| | | <NFormItem label="1#å䏿ºå¯¹åºç第ä¸ä¸ªå¨ä¸æ" path="fs11"> |
| | | <NInput |
| | | v-model:value="model.fs11" |
| | | :rows="3" |
| | | type="textarea" |
| | | placeholder="请è¾å
¥1#å䏿ºå¯¹åºç第ä¸ä¸ªå¨ä¸æ" |
| | | /> |
| | | </NFormItem> |
| | | <NFormItem label="1#å䏿ºå¯¹åºç第äºä¸ªå¨ä¸æ" path="fs12"> |
| | | <NInput |
| | | v-model:value="model.fs12" |
| | | :rows="3" |
| | | type="textarea" |
| | | placeholder="请è¾å
¥1#å䏿ºå¯¹åºç第äºä¸ªå¨ä¸æ" |
| | | /> |
| | | </NFormItem> |
| | | <NFormItem label="2#å䏿ºå¯¹åºç第ä¸ä¸ªå¨ä¸æ" path="fs21"> |
| | | <NInput |
| | | v-model:value="model.fs21" |
| | | :rows="3" |
| | | type="textarea" |
| | | placeholder="请è¾å
¥2#å䏿ºå¯¹åºç第ä¸ä¸ªå¨ä¸æ" |
| | | /> |
| | | </NFormItem> |
| | | <NFormItem label="2#å䏿ºå¯¹åºç第äºä¸ªå¨ä¸æ" path="fs22"> |
| | | <NInput |
| | | v-model:value="model.fs22" |
| | | :rows="3" |
| | | type="textarea" |
| | | placeholder="请è¾å
¥2#å䏿ºå¯¹åºç第äºä¸ªå¨ä¸æ" |
| | | /> |
| | | </NFormItem> |
| | | <NFormItem label="3#å䏿ºå¯¹åºç第ä¸ä¸ªå¨ä¸æ" path="fs31"> |
| | | <NInput |
| | | v-model:value="model.fs31" |
| | | :rows="3" |
| | | type="textarea" |
| | | placeholder="请è¾å
¥3#å䏿ºå¯¹åºç第ä¸ä¸ªå¨ä¸æ" |
| | | /> |
| | | </NFormItem> |
| | | <NFormItem label="3#å䏿ºå¯¹åºç第äºä¸ªå¨ä¸æ" path="fs32"> |
| | | <NInput |
| | | v-model:value="model.fs32" |
| | | :rows="3" |
| | | type="textarea" |
| | | placeholder="请è¾å
¥3#å䏿ºå¯¹åºç第äºä¸ªå¨ä¸æ" |
| | | /> |
| | | </NFormItem> |
| | | <NFormItem label="4#å䏿ºå¯¹åºç第ä¸ä¸ªå¨ä¸æ" path="fs41"> |
| | | <NInput |
| | | v-model:value="model.fs41" |
| | | :rows="3" |
| | | type="textarea" |
| | | placeholder="请è¾å
¥4#å䏿ºå¯¹åºç第ä¸ä¸ªå¨ä¸æ" |
| | | /> |
| | | </NFormItem> |
| | | <NFormItem label="4#å䏿ºå¯¹åºç第äºä¸ªå¨ä¸æ" path="fs42"> |
| | | <NInput |
| | | v-model:value="model.fs42" |
| | | :rows="3" |
| | | type="textarea" |
| | | placeholder="请è¾å
¥4#å䏿ºå¯¹åºç第äºä¸ªå¨ä¸æ" |
| | | /> |
| | | </NFormItem> |
| | | <NFormItem label="1#æºç»å¯¹åºçå䏿ºå管é" path="pipe01"> |
| | | <NInput v-model:value="model.pipe01" placeholder="请è¾å
¥1#æºç»å¯¹åºçå䏿ºå管é" /> |
| | | </NFormItem> |
| | | <NFormItem label="2#æºç»å¯¹åºçå䏿ºå管é" path="pipe02"> |
| | | <NInput v-model:value="model.pipe02" placeholder="请è¾å
¥2#æºç»å¯¹åºçå䏿ºå管é" /> |
| | | </NFormItem> |
| | | <NFormItem label="3#æºç»å¯¹åºçå䏿ºå管é" path="pipe03"> |
| | | <NInput v-model:value="model.pipe03" placeholder="请è¾å
¥3#æºç»å¯¹åºçå䏿ºå管é" /> |
| | | </NFormItem> |
| | | <NFormItem label="4#æºç»å¯¹åºçå䏿ºå管é" path="pipe04"> |
| | | <NInput v-model:value="model.pipe04" placeholder="请è¾å
¥4#æºç»å¯¹åºçå䏿ºå管é" /> |
| | | </NFormItem> |
| | | <NFormItem label="5#æºç»å¯¹åºçå䏿ºå管é" path="pipe05"> |
| | | <NInput v-model:value="model.pipe05" placeholder="请è¾å
¥5#æºç»å¯¹åºçå䏿ºå管é" /> |
| | | </NFormItem> |
| | | <NFormItem label="6#æºç»å¯¹åºçå䏿ºå管é" path="pipe06"> |
| | | <NInput v-model:value="model.pipe06" placeholder="请è¾å
¥6#æºç»å¯¹åºçå䏿ºå管é" /> |
| | | </NFormItem> |
| | | <NFormItem label="7#æºç»å¯¹åºçå䏿ºå管é" path="pipe07"> |
| | | <NInput v-model:value="model.pipe07" placeholder="请è¾å
¥7#æºç»å¯¹åºçå䏿ºå管é" /> |
| | | </NFormItem> |
| | | <NFormItem label="8#æºç»å¯¹åºçå䏿ºå管é" path="pipe08"> |
| | | <NInput v-model:value="model.pipe08" placeholder="请è¾å
¥8#æºç»å¯¹åºçå䏿ºå管é" /> |
| | | </NFormItem> |
| | | <NFormItem label="9#æºç»å¯¹åºçå䏿ºå管é" path="pipe09"> |
| | | <NInput v-model:value="model.pipe09" placeholder="请è¾å
¥9#æºç»å¯¹åºçå䏿ºå管é" /> |
| | | </NFormItem> |
| | | <NFormItem label="10#æºç»å¯¹åºçå䏿ºå管é" path="pipe10"> |
| | | <NInput v-model:value="model.pipe10" placeholder="请è¾å
¥10#æºç»å¯¹åºçå䏿ºå管é" /> |
| | | </NFormItem> |
| | | <NFormItem label="11#æºç»å¯¹åºçå䏿ºå管é" path="pipe11"> |
| | | <NInput v-model:value="model.pipe11" placeholder="请è¾å
¥11#æºç»å¯¹åºçå䏿ºå管é" /> |
| | | </NFormItem> |
| | | <NFormItem label="12#æºç»å¯¹åºçå䏿ºå管é" path="pipe12"> |
| | | <NInput v-model:value="model.pipe12" placeholder="请è¾å
¥12#æºç»å¯¹åºçå䏿ºå管é" /> |
| | | </NFormItem> |
| | | <NFormItem label="å䏿ºç¶æ 1-è¿æ¥ 0-æå¼" path="wsjState"> |
| | | <NInput v-model:value="model.wsjState" placeholder="请è¾å
¥å䏿ºç¶æ 1-è¿æ¥ 0-æå¼" /> |
| | | </NFormItem> |
| | | <NFormItem label="çæ¬¡" path="shift"> |
| | | <NInput v-model:value="model.shift" placeholder="请è¾å
¥ç次" /> |
| | | </NFormItem> |
| | | <NFormItem label="æºå°" path="equNo"> |
| | | <NInput v-model:value="model.equNo" placeholder="请è¾å
¥æºå°" /> |
| | | </NFormItem> |
| | | <NFormItem label="夿³¨" path="remark"> |
| | | <NInput v-model:value="model.remark" placeholder="请è¾å
¥å¤æ³¨" /> |
| | | </NFormItem> |
| | | </NForm> |
| | | <template #footer> |
| | | <NSpace :size="16"> |
| | | <NButton @click="closeDrawer">{{ $t('common.cancel') }}</NButton> |
| | | <NButton type="primary" @click="handleSubmit">{{ $t('common.confirm') }}</NButton> |
| | | </NSpace> |
| | | </template> |
| | | </NDrawerContent> |
| | | </NDrawer> |
| | | </template> |
| | | |
| | | <style scoped></style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script setup lang="ts"> |
| | | import { toRaw } from 'vue'; |
| | | import { jsonClone } from '@sa/utils'; |
| | | import { useNaiveForm } from '@/hooks/common/form'; |
| | | import { $t } from '@/locales'; |
| | | |
| | | defineOptions({ |
| | | name: 'FeedMatchSearch' |
| | | }); |
| | | |
| | | interface Emits { |
| | | (e: 'search'): void; |
| | | } |
| | | |
| | | const emit = defineEmits<Emits>(); |
| | | |
| | | const { formRef, validate, restoreValidation } = useNaiveForm(); |
| | | |
| | | const model = defineModel<Api.Analy.FeedMatchSearchParams>('model', { required: true }); |
| | | |
| | | const defaultModel = jsonClone(toRaw(model.value)); |
| | | |
| | | function resetModel() { |
| | | Object.assign(model.value, defaultModel); |
| | | } |
| | | |
| | | async function reset() { |
| | | await restoreValidation(); |
| | | resetModel(); |
| | | emit('search'); |
| | | } |
| | | |
| | | async function search() { |
| | | await validate(); |
| | | emit('search'); |
| | | } |
| | | </script> |
| | | |
| | | <template> |
| | | <NCard :bordered="false" size="small" class="card-wrapper"> |
| | | <NCollapse> |
| | | <NCollapseItem :title="$t('common.search')" name="analy-feed-match-search"> |
| | | <NForm ref="formRef" :model="model" label-placement="left" :label-width="80"> |
| | | <NGrid responsive="screen" item-responsive> |
| | | <NFormItemGi span="24 s:12 m:6" label="æ¶é´æ³" label-width="auto" path="time" class="pr-24px"> |
| | | <NDatePicker |
| | | v-model:formatted-value="model.time" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | clearable |
| | | /> |
| | | </NFormItemGi> |
| | | <NFormItemGi span="24 s:12 m:6" label="çæ¬¡+æºå°" label-width="auto" path="key" class="pr-24px"> |
| | | <NInput v-model:value="model.key" 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> |
| | | <NButton type="primary" ghost @click="search"> |
| | | <template #icon> |
| | | <icon-ic-round-search class="text-icon" /> |
| | | </template> |
| | | {{ $t('common.search') }} |
| | | </NButton> |
| | | </NSpace> |
| | | </NFormItemGi> |
| | | </NGrid> |
| | | </NForm> |
| | | </NCollapseItem> |
| | | </NCollapse> |
| | | </NCard> |
| | | </template> |
| | | |
| | | <style scoped></style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script setup lang="tsx"> |
| | | import { ref } from 'vue'; |
| | | import { NDivider } from 'naive-ui'; |
| | | import { fetchBatchDeleteStoreSilk, fetchGetStoreSilkList } from '@/service/api/analy/store-silk'; |
| | | 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 ButtonIcon from '@/components/custom/button-icon.vue'; |
| | | import StoreSilkOperateDrawer from './modules/store-silk-operate-drawer.vue'; |
| | | import StoreSilkSearch from './modules/store-silk-search.vue'; |
| | | |
| | | defineOptions({ |
| | | name: 'StoreSilkList' |
| | | }); |
| | | |
| | | |
| | | const appStore = useAppStore(); |
| | | const { download } = useDownload(); |
| | | const { hasAuth } = useAuth(); |
| | | |
| | | const searchParams = ref<Api.Analy.StoreSilkSearchParams>({ |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | materialname: null, |
| | | batchcode: null, |
| | | actualstarttime: null, |
| | | distimebegin: null, |
| | | distimeend: null, |
| | | siloid: null, |
| | | params: {} |
| | | }); |
| | | |
| | | const tableSize = ref<'tiny' | 'small' | 'medium' | 'large'>('small'); |
| | | |
| | | function handleTableSizeChange(size: 'tiny' | 'small' | 'medium' | 'large') { |
| | | tableSize.value = size; |
| | | } |
| | | |
| | | const { columns, columnChecks, data, getData, getDataByPage, loading, mobilePagination, scrollX } = |
| | | useNaivePaginatedTable({ |
| | | api: () => fetchGetStoreSilkList(searchParams.value), |
| | | transform: response => defaultTransform(response), |
| | | onPaginationParamsChange: params => { |
| | | searchParams.value.pageNum = params.page; |
| | | searchParams.value.pageSize = params.pageSize; |
| | | }, |
| | | columns: () => [ |
| | | { |
| | | type: 'selection', |
| | | align: 'center', |
| | | width: 48 |
| | | }, |
| | | { |
| | | key: 'index', |
| | | title: $t('common.index'), |
| | | align: 'center', |
| | | width: 64, |
| | | render: (_, index) => index + 1 |
| | | }, |
| | | { |
| | | key: 'materialname', |
| | | title: 'çå·', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'batchcode', |
| | | title: 'æ¹æ¬¡å·', |
| | | align: 'center', |
| | | minWidth: 130 |
| | | }, |
| | | { |
| | | key: 'roller', |
| | | title: 'å·æ¥äº§é', |
| | | align: 'center', |
| | | minWidth: 100 |
| | | }, |
| | | { |
| | | key: 'packer', |
| | | title: 'å
è£
产é', |
| | | align: 'center', |
| | | minWidth: 100 |
| | | }, |
| | | { |
| | | key: 'actualstarttime', |
| | | title: 'æææ¥æ', |
| | | align: 'center', |
| | | width: 180 |
| | | }, |
| | | { |
| | | key: 'jobinput', |
| | | title: 'ææéé', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'weight', |
| | | title: 'å¨ä¸æéé', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'distimebegin', |
| | | title: 'å¨ä¸æåºæå¼å§æ¶é´', |
| | | align: 'center', |
| | | width: 180 |
| | | }, |
| | | { |
| | | key: 'distimeend', |
| | | title: 'å¨ä¸æåºæç»ææ¶é´', |
| | | align: 'center', |
| | | width: 180 |
| | | }, |
| | | { |
| | | key: 'siloid', |
| | | title: 'æåå·(æ«ä½)', |
| | | align: 'center', |
| | | width: 160 |
| | | }, |
| | | { |
| | | key: 'operate', |
| | | title: $t('common.operate'), |
| | | align: 'center', |
| | | fixed: 'right', |
| | | width: 130, |
| | | render: row => { |
| | | const divider = () => { |
| | | if (!hasAuth('analy:storeSilk:edit') || !hasAuth('analy:storeSilk:remove')) { |
| | | return null; |
| | | } |
| | | return <NDivider vertical />; |
| | | }; |
| | | |
| | | const editBtn = () => { |
| | | if (!hasAuth('analy:storeSilk:edit')) { |
| | | return null; |
| | | } |
| | | return ( |
| | | <ButtonIcon |
| | | text |
| | | type="primary" |
| | | icon="material-symbols:drive-file-rename-outline-outline" |
| | | tooltipContent={$t('common.edit')} |
| | | onClick={() => edit(row.id)} |
| | | /> |
| | | ); |
| | | }; |
| | | |
| | | const deleteBtn = () => { |
| | | if (!hasAuth('analy:storeSilk:remove')) { |
| | | return null; |
| | | } |
| | | return ( |
| | | <ButtonIcon |
| | | text |
| | | type="error" |
| | | icon="material-symbols:delete-outline" |
| | | tooltipContent={$t('common.delete')} |
| | | popconfirmContent={$t('common.confirmDelete')} |
| | | onPositiveClick={() => handleDelete(row.id)} |
| | | /> |
| | | ); |
| | | }; |
| | | |
| | | return ( |
| | | <div class="flex-center gap-8px"> |
| | | {editBtn()} |
| | | {divider()} |
| | | {deleteBtn()} |
| | | </div> |
| | | ); |
| | | } |
| | | } |
| | | ] |
| | | }); |
| | | |
| | | const { drawerVisible, operateType, editingData, handleAdd, handleEdit, checkedRowKeys, onBatchDeleted, onDeleted } = |
| | | useTableOperate(data, 'id', getData); |
| | | |
| | | async function handleBatchDelete() { |
| | | // request |
| | | const { error } = await fetchBatchDeleteStoreSilk(checkedRowKeys.value); |
| | | if (error) return; |
| | | onBatchDeleted(); |
| | | } |
| | | |
| | | async function handleDelete(id: CommonType.IdType) { |
| | | // request |
| | | const { error } = await fetchBatchDeleteStoreSilk([id]); |
| | | if (error) return; |
| | | onDeleted(); |
| | | } |
| | | |
| | | function edit(id: CommonType.IdType) { |
| | | handleEdit(id); |
| | | } |
| | | |
| | | function handleExport() { |
| | | download('/analy/storeSilk/export', searchParams.value, `å¨ä¸æäº§é_${new Date().getTime()}.xlsx`); |
| | | } |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="min-h-500px flex-col-stretch gap-16px overflow-hidden lt-sm:overflow-auto"> |
| | | <StoreSilkSearch 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('analy:storeSilk:add')" |
| | | :show-delete="hasAuth('analy:storeSilk:remove')" |
| | | :show-export="hasAuth('analy:storeSilk:export')" |
| | | @add="handleAdd" |
| | | @delete="handleBatchDelete" |
| | | @export="handleExport" |
| | | @refresh="getData" |
| | | > |
| | | <template #suffix> |
| | | <NPopover placement="bottom-end" trigger="click"> |
| | | <template #trigger> |
| | | <NButton size="small"> |
| | | <template #icon> |
| | | <icon-mdi-table-large class="text-icon" /> |
| | | </template> |
| | | è¡¨æ ¼å¤§å° |
| | | </NButton> |
| | | </template> |
| | | <NRadioGroup :value="tableSize" @update:value="handleTableSizeChange"> |
| | | <NSpace vertical> |
| | | <NRadio value="tiny">mini</NRadio> |
| | | <NRadio value="small">å°</NRadio> |
| | | <NRadio value="medium">ä¸</NRadio> |
| | | <NRadio value="large">大</NRadio> |
| | | </NSpace> |
| | | </NRadioGroup> |
| | | </NPopover> |
| | | </template> |
| | | </TableHeaderOperation> |
| | | </template> |
| | | <NDataTable |
| | | v-model:checked-row-keys="checkedRowKeys" |
| | | :columns="columns" |
| | | :data="data" |
| | | :size="tableSize" |
| | | :flex-height="!appStore.isMobile" |
| | | :scroll-x="scrollX" |
| | | :loading="loading" |
| | | remote |
| | | :row-key="row => row.id" |
| | | :pagination="mobilePagination" |
| | | :class="['sm:h-full', tableSize === 'tiny' ? 'table-size-mini' : '']" |
| | | /> |
| | | <StoreSilkOperateDrawer |
| | | v-model:visible="drawerVisible" |
| | | :operate-type="operateType" |
| | | :row-data="editingData" |
| | | @submitted="getDataByPage" |
| | | /> |
| | | </NCard> |
| | | </div> |
| | | </template> |
| | | |
| | | <style scoped> |
| | | :deep(.table-size-mini .n-data-table-th), |
| | | :deep(.table-size-mini .n-data-table-td) { |
| | | padding-top: 4px; |
| | | padding-bottom: 4px; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script setup lang="ts"> |
| | | import { computed, ref, watch } from 'vue'; |
| | | import { jsonClone } from '@sa/utils'; |
| | | import { fetchCreateStoreSilk, fetchUpdateStoreSilk } from '@/service/api/analy/store-silk'; |
| | | import { useFormRules, useNaiveForm } from '@/hooks/common/form'; |
| | | import { $t } from '@/locales'; |
| | | |
| | | defineOptions({ |
| | | name: 'StoreSilkOperateDrawer' |
| | | }); |
| | | |
| | | interface Props { |
| | | /** the type of operation */ |
| | | operateType: NaiveUI.TableOperateType; |
| | | /** the edit row data */ |
| | | rowData?: Api.Analy.StoreSilk | null; |
| | | } |
| | | |
| | | const props = defineProps<Props>(); |
| | | |
| | | interface Emits { |
| | | (e: 'submitted'): void; |
| | | } |
| | | |
| | | const emit = defineEmits<Emits>(); |
| | | |
| | | const visible = defineModel<boolean>('visible', { |
| | | default: false |
| | | }); |
| | | |
| | | const { formRef, validate, restoreValidation } = useNaiveForm(); |
| | | const { createRequiredRule } = useFormRules(); |
| | | |
| | | const title = computed(() => { |
| | | const titles: Record<NaiveUI.TableOperateType, string> = { |
| | | add: 'æ°å¢å¨ä¸æäº§é', |
| | | edit: 'ç¼è¾å¨ä¸æäº§é' |
| | | }; |
| | | return titles[props.operateType]; |
| | | }); |
| | | |
| | | type Model = Api.Analy.StoreSilkOperateParams; |
| | | |
| | | const model = ref<Model>(createDefaultModel()); |
| | | |
| | | function createDefaultModel(): Model { |
| | | return { |
| | | id: null, |
| | | materialname: '', |
| | | batchcode: '', |
| | | actualstarttime: null, |
| | | jobinput: null, |
| | | weightloss: null, |
| | | slkrate: null, |
| | | weight: null, |
| | | distimebegin: null, |
| | | distimeend: null, |
| | | siloid: '' |
| | | }; |
| | | } |
| | | |
| | | type RuleKey = Extract< |
| | | keyof Model, |
| | | | 'id' |
| | | | 'materialname' |
| | | | 'batchcode' |
| | | >; |
| | | |
| | | const rules: Record<RuleKey, App.Global.FormRule> = { |
| | | id: createRequiredRule('idä¸è½ä¸ºç©º'), |
| | | materialname: createRequiredRule('çå·ä¸è½ä¸ºç©º'), |
| | | batchcode: createRequiredRule('æ¹æ¬¡å·ä¸è½ä¸ºç©º'), |
| | | }; |
| | | |
| | | function handleUpdateModelWhenEdit() { |
| | | model.value = createDefaultModel(); |
| | | |
| | | if (props.operateType === 'edit' && props.rowData) { |
| | | Object.assign(model.value, jsonClone(props.rowData)); |
| | | } |
| | | } |
| | | |
| | | function closeDrawer() { |
| | | visible.value = false; |
| | | } |
| | | |
| | | async function handleSubmit() { |
| | | await validate(); |
| | | |
| | | const { id, materialname, batchcode, actualstarttime, jobinput, weightloss, slkrate, weight, distimebegin, distimeend, siloid } = model.value; |
| | | |
| | | // request |
| | | if (props.operateType === 'add') { |
| | | const { error } = await fetchCreateStoreSilk({ materialname, batchcode, actualstarttime, jobinput, weightloss, slkrate, weight, distimebegin, distimeend, siloid }); |
| | | if (error) return; |
| | | } |
| | | |
| | | if (props.operateType === 'edit') { |
| | | const { error } = await fetchUpdateStoreSilk({ id, materialname, batchcode, actualstarttime, jobinput, weightloss, slkrate, weight, distimebegin, distimeend, siloid }); |
| | | if (error) return; |
| | | } |
| | | |
| | | window.$message?.success($t('common.updateSuccess')); |
| | | closeDrawer(); |
| | | emit('submitted'); |
| | | } |
| | | |
| | | watch(visible, () => { |
| | | if (visible.value) { |
| | | handleUpdateModelWhenEdit(); |
| | | restoreValidation(); |
| | | } |
| | | }); |
| | | </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="materialname"> |
| | | <NInput v-model:value="model.materialname" placeholder="请è¾å
¥çå·" /> |
| | | </NFormItem> |
| | | <NFormItem label="æ¹æ¬¡å·" path="batchcode"> |
| | | <NInput v-model:value="model.batchcode" placeholder="请è¾å
¥æ¹æ¬¡å·" /> |
| | | </NFormItem> |
| | | <NFormItem label="æææ¥æ" path="actualstarttime"> |
| | | <NDatePicker |
| | | v-model:formatted-value="model.actualstarttime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | clearable |
| | | /> |
| | | </NFormItem> |
| | | <NFormItem label="ææéé" path="jobinput"> |
| | | <NInput v-model:value="model.jobinput" placeholder="请è¾å
¥ææéé" /> |
| | | </NFormItem> |
| | | <NFormItem label="æèéé" path="weightloss"> |
| | | <NInput v-model:value="model.weightloss" placeholder="请è¾å
¥æèéé" /> |
| | | </NFormItem> |
| | | <NFormItem label="åºå¶ä¸ç" path="slkrate"> |
| | | <NInput v-model:value="model.slkrate" placeholder="请è¾å
¥åºå¶ä¸ç" /> |
| | | </NFormItem> |
| | | <NFormItem label="å¨ä¸æéé" path="weight"> |
| | | <NInput v-model:value="model.weight" placeholder="请è¾å
¥å¨ä¸æéé" /> |
| | | </NFormItem> |
| | | <NFormItem label="å¨ä¸æåºæå¼å§æ¶é´" path="distimebegin"> |
| | | <NDatePicker |
| | | v-model:formatted-value="model.distimebegin" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | clearable |
| | | /> |
| | | </NFormItem> |
| | | <NFormItem label="å¨ä¸æåºæç»ææ¶é´" path="distimeend"> |
| | | <NDatePicker |
| | | v-model:formatted-value="model.distimeend" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | clearable |
| | | /> |
| | | </NFormItem> |
| | | <NFormItem label="æåå·(æ«ä½)" path="siloid"> |
| | | <NInput v-model:value="model.siloid" placeholder="请è¾å
¥æåå·(æ«ä½)" /> |
| | | </NFormItem> |
| | | </NForm> |
| | | <template #footer> |
| | | <NSpace :size="16"> |
| | | <NButton @click="closeDrawer">{{ $t('common.cancel') }}</NButton> |
| | | <NButton type="primary" @click="handleSubmit">{{ $t('common.confirm') }}</NButton> |
| | | </NSpace> |
| | | </template> |
| | | </NDrawerContent> |
| | | </NDrawer> |
| | | </template> |
| | | |
| | | <style scoped></style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script setup lang="ts"> |
| | | import { toRaw } from 'vue'; |
| | | import { jsonClone } from '@sa/utils'; |
| | | import { useNaiveForm } from '@/hooks/common/form'; |
| | | import { $t } from '@/locales'; |
| | | |
| | | defineOptions({ |
| | | name: 'StoreSilkSearch' |
| | | }); |
| | | |
| | | interface Emits { |
| | | (e: 'search'): void; |
| | | } |
| | | |
| | | const emit = defineEmits<Emits>(); |
| | | |
| | | const { formRef, validate, restoreValidation } = useNaiveForm(); |
| | | |
| | | const model = defineModel<Api.Analy.StoreSilkSearchParams>('model', { required: true }); |
| | | |
| | | const defaultModel = jsonClone(toRaw(model.value)); |
| | | |
| | | function resetModel() { |
| | | Object.assign(model.value, defaultModel); |
| | | } |
| | | |
| | | async function reset() { |
| | | await restoreValidation(); |
| | | resetModel(); |
| | | emit('search'); |
| | | } |
| | | |
| | | async function search() { |
| | | await validate(); |
| | | emit('search'); |
| | | } |
| | | </script> |
| | | |
| | | <template> |
| | | <NCard :bordered="false" size="small" class="card-wrapper"> |
| | | <NCollapse> |
| | | <NCollapseItem :title="$t('common.search')" name="analy-store-silk-search"> |
| | | <NForm ref="formRef" :model="model" label-placement="left" :label-width="80"> |
| | | <NGrid responsive="screen" item-responsive> |
| | | <NFormItemGi span="24 s:12 m:6" label="çå·" label-width="auto" path="materialname" class="pr-24px"> |
| | | <NInput v-model:value="model.materialname" placeholder="请è¾å
¥çå·" /> |
| | | </NFormItemGi> |
| | | <NFormItemGi span="24 s:12 m:6" label="æ¹æ¬¡å·" label-width="auto" path="batchcode" class="pr-24px"> |
| | | <NInput v-model:value="model.batchcode" placeholder="请è¾å
¥æ¹æ¬¡å·" /> |
| | | </NFormItemGi> |
| | | <NFormItemGi span="24 s:12 m:6" label="æææ¥æ" label-width="auto" path="actualstarttime" class="pr-24px"> |
| | | <NDatePicker |
| | | v-model:formatted-value="model.actualstarttime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | clearable |
| | | /> |
| | | </NFormItemGi> |
| | | <NFormItemGi span="24 s:12 m:6" label="å¨ä¸æåºæå¼å§æ¶é´" label-width="auto" path="distimebegin" class="pr-24px"> |
| | | <NDatePicker |
| | | v-model:formatted-value="model.distimebegin" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | clearable |
| | | /> |
| | | </NFormItemGi> |
| | | <NFormItemGi span="24 s:12 m:6" label="å¨ä¸æåºæç»ææ¶é´" label-width="auto" path="distimeend" class="pr-24px"> |
| | | <NDatePicker |
| | | v-model:formatted-value="model.distimeend" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | clearable |
| | | /> |
| | | </NFormItemGi> |
| | | <NFormItemGi span="24 s:12 m:6" label="æåå·(æ«ä½)" label-width="auto" path="siloid" class="pr-24px"> |
| | | <NInput v-model:value="model.siloid" 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> |
| | | <NButton type="primary" ghost @click="search"> |
| | | <template #icon> |
| | | <icon-ic-round-search class="text-icon" /> |
| | | </template> |
| | | {{ $t('common.search') }} |
| | | </NButton> |
| | | </NSpace> |
| | | </NFormItemGi> |
| | | </NGrid> |
| | | </NForm> |
| | | </NCollapseItem> |
| | | </NCollapse> |
| | | </NCard> |
| | | </template> |
| | | |
| | | <style scoped></style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script setup lang="tsx"> |
| | | import { ref } from 'vue'; |
| | | import { NDivider } from 'naive-ui'; |
| | | import { fetchBatchDeleteShift, fetchGetShiftList } from '@/service/api/md/shift'; |
| | | 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 ButtonIcon from '@/components/custom/button-icon.vue'; |
| | | import ShiftOperateDrawer from './modules/shift-operate-drawer.vue'; |
| | | import ShiftSearch from './modules/shift-search.vue'; |
| | | |
| | | defineOptions({ |
| | | name: 'ShiftList' |
| | | }); |
| | | |
| | | |
| | | const appStore = useAppStore(); |
| | | const { download } = useDownload(); |
| | | const { hasAuth } = useAuth(); |
| | | |
| | | const searchParams = ref<Api.Md.ShiftSearchParams>({ |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | code: null, |
| | | name: null, |
| | | enable: null, |
| | | params: {} |
| | | }); |
| | | |
| | | const { columns, columnChecks, data, getData, getDataByPage, loading, mobilePagination, scrollX } = |
| | | useNaivePaginatedTable({ |
| | | api: () => fetchGetShiftList(searchParams.value), |
| | | transform: response => defaultTransform(response), |
| | | onPaginationParamsChange: params => { |
| | | searchParams.value.pageNum = params.page; |
| | | searchParams.value.pageSize = params.pageSize; |
| | | }, |
| | | columns: () => [ |
| | | { |
| | | type: 'selection', |
| | | align: 'center', |
| | | width: 48 |
| | | }, |
| | | { |
| | | key: 'index', |
| | | title: $t('common.index'), |
| | | align: 'center', |
| | | width: 64, |
| | | render: (_, index) => index + 1 |
| | | }, |
| | | { |
| | | key: 'id', |
| | | title: 'ud', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'wsId', |
| | | title: '车é´å¤é®', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'code', |
| | | title: 'ç¼ç ', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'name', |
| | | title: 'åç§°', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'stim', |
| | | title: 'çæ¬¡å¼å§æ¶é´', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'etim', |
| | | title: 'çæ¬¡ç»ææ¶é´', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'seq', |
| | | title: 'æåº', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'enable', |
| | | title: 'å¯ç¨', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'del', |
| | | title: 'å é¤', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'createUserName', |
| | | title: 'åå»ºç¨æ·', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'createUserTime', |
| | | title: 'å建æ¶é´', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'updateUserName', |
| | | title: 'æ´æ°ç¨æ·', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'updateUserTime', |
| | | title: 'æ´æ°æ¶é´', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'operate', |
| | | title: $t('common.operate'), |
| | | align: 'center', |
| | | width: 130, |
| | | render: row => { |
| | | const divider = () => { |
| | | if (!hasAuth('md:shift:edit') || !hasAuth('md:shift:remove')) { |
| | | return null; |
| | | } |
| | | return <NDivider vertical />; |
| | | }; |
| | | |
| | | const editBtn = () => { |
| | | if (!hasAuth('md:shift:edit')) { |
| | | return null; |
| | | } |
| | | return ( |
| | | <ButtonIcon |
| | | text |
| | | type="primary" |
| | | icon="material-symbols:drive-file-rename-outline-outline" |
| | | tooltipContent={$t('common.edit')} |
| | | onClick={() => edit(row.id)} |
| | | /> |
| | | ); |
| | | }; |
| | | |
| | | const deleteBtn = () => { |
| | | if (!hasAuth('md:shift:remove')) { |
| | | return null; |
| | | } |
| | | return ( |
| | | <ButtonIcon |
| | | text |
| | | type="error" |
| | | icon="material-symbols:delete-outline" |
| | | tooltipContent={$t('common.delete')} |
| | | popconfirmContent={$t('common.confirmDelete')} |
| | | onPositiveClick={() => handleDelete(row.id)} |
| | | /> |
| | | ); |
| | | }; |
| | | |
| | | return ( |
| | | <div class="flex-center gap-8px"> |
| | | {editBtn()} |
| | | {divider()} |
| | | {deleteBtn()} |
| | | </div> |
| | | ); |
| | | } |
| | | } |
| | | ] |
| | | }); |
| | | |
| | | const { drawerVisible, operateType, editingData, handleAdd, handleEdit, checkedRowKeys, onBatchDeleted, onDeleted } = |
| | | useTableOperate(data, 'id', getData); |
| | | |
| | | async function handleBatchDelete() { |
| | | // request |
| | | const { error } = await fetchBatchDeleteShift(checkedRowKeys.value); |
| | | if (error) return; |
| | | onBatchDeleted(); |
| | | } |
| | | |
| | | async function handleDelete(id: CommonType.IdType) { |
| | | // request |
| | | const { error } = await fetchBatchDeleteShift([id]); |
| | | if (error) return; |
| | | onDeleted(); |
| | | } |
| | | |
| | | function edit(id: CommonType.IdType) { |
| | | handleEdit(id); |
| | | } |
| | | |
| | | function handleExport() { |
| | | download('/md/shift/export', searchParams.value, `çæ¬¡_${new Date().getTime()}.xlsx`); |
| | | } |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="min-h-500px flex-col-stretch gap-16px overflow-hidden lt-sm:overflow-auto"> |
| | | <ShiftSearch 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('md:shift:add')" |
| | | :show-delete="hasAuth('md:shift:remove')" |
| | | :show-export="hasAuth('md:shift: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" |
| | | class="sm:h-full" |
| | | /> |
| | | <ShiftOperateDrawer |
| | | v-model:visible="drawerVisible" |
| | | :operate-type="operateType" |
| | | :row-data="editingData" |
| | | @submitted="getDataByPage" |
| | | /> |
| | | </NCard> |
| | | </div> |
| | | </template> |
| | | |
| | | <style scoped></style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script setup lang="ts"> |
| | | import { computed, ref, watch } from 'vue'; |
| | | import { jsonClone } from '@sa/utils'; |
| | | import { fetchCreateShift, fetchUpdateShift } from '@/service/api/md/shift'; |
| | | import { useFormRules, useNaiveForm } from '@/hooks/common/form'; |
| | | import { $t } from '@/locales'; |
| | | |
| | | defineOptions({ |
| | | name: 'ShiftOperateDrawer' |
| | | }); |
| | | |
| | | interface Props { |
| | | /** the type of operation */ |
| | | operateType: NaiveUI.TableOperateType; |
| | | /** the edit row data */ |
| | | rowData?: Api.Md.Shift | null; |
| | | } |
| | | |
| | | const props = defineProps<Props>(); |
| | | |
| | | interface Emits { |
| | | (e: 'submitted'): void; |
| | | } |
| | | |
| | | const emit = defineEmits<Emits>(); |
| | | |
| | | const visible = defineModel<boolean>('visible', { |
| | | default: false |
| | | }); |
| | | |
| | | const { formRef, validate, restoreValidation } = useNaiveForm(); |
| | | const { createRequiredRule } = useFormRules(); |
| | | |
| | | const title = computed(() => { |
| | | const titles: Record<NaiveUI.TableOperateType, string> = { |
| | | add: 'æ°å¢ç次', |
| | | edit: 'ç¼è¾ç次' |
| | | }; |
| | | return titles[props.operateType]; |
| | | }); |
| | | |
| | | type Model = Api.Md.ShiftOperateParams; |
| | | |
| | | const model = ref<Model>(createDefaultModel()); |
| | | |
| | | function createDefaultModel(): Model { |
| | | return { |
| | | id: '', |
| | | wsId: '', |
| | | code: '', |
| | | name: '', |
| | | stim: '', |
| | | etim: '', |
| | | seq: null, |
| | | enable: null, |
| | | del: null, |
| | | createUserName: '', |
| | | createUserTime: null, |
| | | updateUserName: '', |
| | | updateUserTime: null |
| | | }; |
| | | } |
| | | |
| | | type RuleKey = Extract< |
| | | keyof Model, |
| | | | 'id' |
| | | >; |
| | | |
| | | const rules: Record<RuleKey, App.Global.FormRule> = { |
| | | id: createRequiredRule('udä¸è½ä¸ºç©º'), |
| | | }; |
| | | |
| | | function handleUpdateModelWhenEdit() { |
| | | model.value = createDefaultModel(); |
| | | |
| | | if (props.operateType === 'edit' && props.rowData) { |
| | | Object.assign(model.value, jsonClone(props.rowData)); |
| | | } |
| | | } |
| | | |
| | | function closeDrawer() { |
| | | visible.value = false; |
| | | } |
| | | |
| | | async function handleSubmit() { |
| | | await validate(); |
| | | |
| | | const { id, wsId, code, name, stim, etim, seq, enable, del, createUserName, createUserTime, updateUserName, updateUserTime } = model.value; |
| | | |
| | | // request |
| | | if (props.operateType === 'add') { |
| | | const { error } = await fetchCreateShift({ wsId, code, name, stim, etim, seq, enable, del, createUserName, createUserTime, updateUserName, updateUserTime }); |
| | | if (error) return; |
| | | } |
| | | |
| | | if (props.operateType === 'edit') { |
| | | const { error } = await fetchUpdateShift({ id, wsId, code, name, stim, etim, seq, enable, del, createUserName, createUserTime, updateUserName, updateUserTime }); |
| | | if (error) return; |
| | | } |
| | | |
| | | window.$message?.success($t('common.updateSuccess')); |
| | | closeDrawer(); |
| | | emit('submitted'); |
| | | } |
| | | |
| | | watch(visible, () => { |
| | | if (visible.value) { |
| | | handleUpdateModelWhenEdit(); |
| | | restoreValidation(); |
| | | } |
| | | }); |
| | | </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="wsId"> |
| | | <NInput v-model:value="model.wsId" placeholder="请è¾å
¥è½¦é´å¤é®" /> |
| | | </NFormItem> |
| | | <NFormItem label="ç¼ç " path="code"> |
| | | <NInput v-model:value="model.code" placeholder="请è¾å
¥ç¼ç " /> |
| | | </NFormItem> |
| | | <NFormItem label="åç§°" path="name"> |
| | | <NInput v-model:value="model.name" placeholder="请è¾å
¥åç§°" /> |
| | | </NFormItem> |
| | | <NFormItem label="çæ¬¡å¼å§æ¶é´" path="stim"> |
| | | <NInput v-model:value="model.stim" placeholder="请è¾å
¥ç次å¼å§æ¶é´" /> |
| | | </NFormItem> |
| | | <NFormItem label="çæ¬¡ç»ææ¶é´" path="etim"> |
| | | <NInput v-model:value="model.etim" placeholder="请è¾å
¥çæ¬¡ç»ææ¶é´" /> |
| | | </NFormItem> |
| | | <NFormItem label="æåº" path="seq"> |
| | | <NInput v-model:value="model.seq" placeholder="请è¾å
¥æåº" /> |
| | | </NFormItem> |
| | | <NFormItem label="å¯ç¨" path="enable"> |
| | | <NInput v-model:value="model.enable" placeholder="请è¾å
¥å¯ç¨" /> |
| | | </NFormItem> |
| | | <NFormItem label="å é¤" path="del"> |
| | | <NInput v-model:value="model.del" placeholder="请è¾å
¥å é¤" /> |
| | | </NFormItem> |
| | | <NFormItem label="åå»ºç¨æ·" path="createUserName"> |
| | | <NInput v-model:value="model.createUserName" placeholder="请è¾å
¥åå»ºç¨æ·" /> |
| | | </NFormItem> |
| | | <NFormItem label="å建æ¶é´" path="createUserTime"> |
| | | <NDatePicker |
| | | v-model:formatted-value="model.createUserTime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | clearable |
| | | /> |
| | | </NFormItem> |
| | | <NFormItem label="æ´æ°ç¨æ·" path="updateUserName"> |
| | | <NInput v-model:value="model.updateUserName" placeholder="请è¾å
¥æ´æ°ç¨æ·" /> |
| | | </NFormItem> |
| | | <NFormItem label="æ´æ°æ¶é´" path="updateUserTime"> |
| | | <NDatePicker |
| | | v-model:formatted-value="model.updateUserTime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | clearable |
| | | /> |
| | | </NFormItem> |
| | | </NForm> |
| | | <template #footer> |
| | | <NSpace :size="16"> |
| | | <NButton @click="closeDrawer">{{ $t('common.cancel') }}</NButton> |
| | | <NButton type="primary" @click="handleSubmit">{{ $t('common.confirm') }}</NButton> |
| | | </NSpace> |
| | | </template> |
| | | </NDrawerContent> |
| | | </NDrawer> |
| | | </template> |
| | | |
| | | <style scoped></style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script setup lang="ts"> |
| | | import { toRaw } from 'vue'; |
| | | import { jsonClone } from '@sa/utils'; |
| | | import { useNaiveForm } from '@/hooks/common/form'; |
| | | import { $t } from '@/locales'; |
| | | |
| | | defineOptions({ |
| | | name: 'ShiftSearch' |
| | | }); |
| | | |
| | | interface Emits { |
| | | (e: 'search'): void; |
| | | } |
| | | |
| | | const emit = defineEmits<Emits>(); |
| | | |
| | | const { formRef, validate, restoreValidation } = useNaiveForm(); |
| | | |
| | | const model = defineModel<Api.Md.ShiftSearchParams>('model', { required: true }); |
| | | |
| | | const defaultModel = jsonClone(toRaw(model.value)); |
| | | |
| | | function resetModel() { |
| | | Object.assign(model.value, defaultModel); |
| | | } |
| | | |
| | | async function reset() { |
| | | await restoreValidation(); |
| | | resetModel(); |
| | | emit('search'); |
| | | } |
| | | |
| | | async function search() { |
| | | await validate(); |
| | | emit('search'); |
| | | } |
| | | </script> |
| | | |
| | | <template> |
| | | <NCard :bordered="false" size="small" class="card-wrapper"> |
| | | <NCollapse> |
| | | <NCollapseItem :title="$t('common.search')" name="md-shift-search"> |
| | | <NForm ref="formRef" :model="model" label-placement="left" :label-width="80"> |
| | | <NGrid responsive="screen" item-responsive> |
| | | <NFormItemGi span="24 s:12 m:6" label="ç¼ç " label-width="auto" path="code" class="pr-24px"> |
| | | <NInput v-model:value="model.code" placeholder="请è¾å
¥ç¼ç " /> |
| | | </NFormItemGi> |
| | | <NFormItemGi span="24 s:12 m:6" label="åç§°" label-width="auto" path="name" class="pr-24px"> |
| | | <NInput v-model:value="model.name" placeholder="请è¾å
¥åç§°" /> |
| | | </NFormItemGi> |
| | | <NFormItemGi span="24 s:12 m:6" label="å¯ç¨" label-width="auto" path="enable" class="pr-24px"> |
| | | <NInput v-model:value="model.enable" 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> |
| | | <NButton type="primary" ghost @click="search"> |
| | | <template #icon> |
| | | <icon-ic-round-search class="text-icon" /> |
| | | </template> |
| | | {{ $t('common.search') }} |
| | | </NButton> |
| | | </NSpace> |
| | | </NFormItemGi> |
| | | </NGrid> |
| | | </NForm> |
| | | </NCollapseItem> |
| | | </NCollapse> |
| | | </NCard> |
| | | </template> |
| | | |
| | | <style scoped></style> |