zhangwencui
2026-10-21 7061bcfaa203a15f486eb7bbd64efb61944034fd
一、排查并移除 App 端所有导入、导出功能及相关接口。

二、优化考勤记录模块,仅保留员工姓名搜索。

三、调整售后工单 Tab 样式,与现有 App 页面保持一致。

四、修复排班管理错误提示“暂无排班查看权限”的问题。

五、完成备件台账、备件入库、领用记录及退回功能开发。

六、完成工序流转卡及工序明细功能开发,支持提交、完工、取消等操作。

七、检查 Web 端 10 月 Git 更新,同步一键排产等 App 端相关功能。

八、修复多个页面悬浮新增按钮“+”号偏移、变形问题。
已添加7个文件
已修改45个文件
345 ■■■■■ 文件已修改
src/api/hrm.ts 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/mes-operations.ts 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/production.ts 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/config/app-routes.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/config/company.ts 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages.json 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/aftersales/list.scss 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/energy/record/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/hrm/attendance-holiday/index.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/hrm/attendance-record/index.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/hrm/attendance-rule/index.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/hrm/components/HrmCrudPage.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/hrm/schedule/index.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/hrm/shift/index.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/cal/plan/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/cal/team/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/checkplan/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/machinery/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/machinery/type/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/maintenrecord/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/metering/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/meteringcheck/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/repair/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/spare-record/index.vue 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/spare/action.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/spare/form.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/spare/index.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/subject/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/pd/archive/index.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/pro/card/form.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/pro/card/index.vue 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/pro/feedback/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/pro/mps/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/pro/task/index.vue 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/pro/workorder/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/defect/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/indicator/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/ncr/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/report/template/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/template/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/tm/tool/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/tm/tool/type/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/wls/barcode/config.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/wls/barcode/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/wls/components/WlsComplexList.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/wls/components/WlsDocList.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/wls/components/WlsExtraDocList.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/wls/components/WlsFlowDocList.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/wls/sn/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/wls/warehouse/area.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/wls/warehouse/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/wls/warehouse/location.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/hrm.ts
@@ -87,30 +87,6 @@
  return content ? `?${content}` : "";
}
export function downloadHrmFile(token: string, path: string, params: Record<string, string | number | boolean | undefined> = {}) {
  return new Promise<void>((resolve, reject) => {
    uni.showLoading({ title: "下载中…", mask: true });
    uni.downloadFile({
      url: `${API_BASE_URL}${path}${query(params)}`,
      header: header(token),
      success: result => {
        if (result.statusCode !== 200) return reject(new Error("文件下载失败"));
        uni.openDocument({ filePath: result.tempFilePath, showMenu: true, success: () => resolve(), fail: () => { uni.setClipboardData({ data: `${API_BASE_URL}${path}${query(params)}` }); resolve(); } });
      },
      fail: () => reject(new Error("文件下载失败")),
      complete: () => uni.hideLoading()
    });
  });
}
export function importAttendanceFile(token: string, filePath: string, updateSupport = false) {
  return new Promise<void>((resolve, reject) => uni.uploadFile({
    url: `${API_BASE_URL}/hrm/attendance/record/import`, filePath, name: "file", header: header(token), formData: { updateSupport: String(updateSupport) },
    success: response => { try { const result = JSON.parse(response.data) as ApiResponse<unknown>; result.code === 0 ? resolve() : reject(new Error(result.msg || "导入失败")); } catch { reject(new Error("导入响应解析失败")); } },
    fail: () => reject(new Error("导入失败"))
  }));
}
export function getHrmDicts(token: string) { return request<DictData[]>("/system/dict-data/simple-list", { header: header(token) }); }
export function getHrmDeptList(token: string) { return request<DeptSimple[]>("/system/dept/simple-list", { header: header(token) }); }
export function getHrmPostList(token: string) { return request<SimpleOption[]>("/system/post/simple-list", { header: header(token) }); }
src/api/mes-operations.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
import { request } from "./request";
import type { PageResult } from "./basic-data";
export interface SparePart { id?:number;code?:string;name?:string;specification?:string;unit?:string;location?:string;stockQuantity?:number;safetyQuantity?:number;status?:number;remark?:string }
export interface SpareMovement { id?:number;sparePartId?:number;sparePartCode?:string;sparePartName?:string;specification?:string;unit?:string;type?:number;quantity?:number;beforeQuantity?:number;afterQuantity?:number;repairId?:number;repairCode?:string;machineryName?:string;receiverName?:string;receiverUserId?:number;operatorUserId?:number;originalId?:number;returnedQuantity?:number;returnableQuantity?:number;remark?:string;createTime?:string }
export interface SpareSave extends SparePart { initialQuantity?:number }
export interface SpareAction { requestKey:string;sparePartId?:number;repairId?:number;originalId?:number;receiverUserId?:number;quantity:number;remark:string }
export interface TransferCard { id?:number;code?:string;workOrderId?:number;workOrderCode?:string;workOrderName?:string;batchCode?:string;itemId?:number;itemCode?:string;itemName?:string;specification?:string;unitMeasureName?:string;transferedQuantity?:number;status?:number;remark?:string;createTime?:string }
export interface TransferProcess { id?:number;cardId?:number;sort?:number;processId?:number;processCode?:string;processName?:string;inputTime?:string;outputTime?:string;inputQuantity?:number;outputQuantity?:number;unqualifiedQuantity?:number;workstationId?:number;workstationCode?:string;workstationName?:string;userId?:number;nickname?:string;ipqcId?:number;remark?:string }
type QueryValue=string|number|boolean|undefined;
function header(token:string){return {Authorization:"Bearer "+token}}
function query(params:Record<string,QueryValue>){const value=Object.entries(params).filter(([,v])=>v!==undefined&&v!=="").map(([k,v])=>encodeURIComponent(k)+"="+encodeURIComponent(String(v))).join("&");return value?"?"+value:""}
export function getSparePage(token:string,params:{pageNo:number;pageSize:number;code?:string;name?:string;status?:number;shortageOnly?:boolean}){return request<PageResult<SparePart>>("/mes/dv/spare/page"+query(params),{header:header(token)})}
export function getSpare(token:string,id:number){return request<SparePart>("/mes/dv/spare/get"+query({id}),{header:header(token)})}
export function createSpare(token:string,data:SpareSave){return request<number>("/mes/dv/spare/create",{method:"POST",data:data as Record<string,unknown>,header:header(token)})}
export function updateSpare(token:string,data:SpareSave){return request<boolean>("/mes/dv/spare/update",{method:"PUT",data:data as Record<string,unknown>,header:header(token)})}
export function deleteSpare(token:string,id:number){return request<boolean>("/mes/dv/spare/delete"+query({id}),{method:"DELETE",header:header(token)})}
export function getSpareMovementPage(token:string,params:{pageNo:number;pageSize:number;sparePartId?:number;repairId?:number;repairCode?:string;type?:number}){return request<PageResult<SpareMovement>>("/mes/dv/spare/movement-page"+query(params),{header:header(token)})}
export function receiveSpare(token:string,data:SpareAction){return request<boolean>("/mes/dv/spare/receive",{method:"POST",data:data as unknown as Record<string,unknown>,header:header(token)})}
export function issueSpare(token:string,data:SpareAction){return request<boolean>("/mes/dv/spare/issue",{method:"POST",data:data as unknown as Record<string,unknown>,header:header(token)})}
export function returnSpare(token:string,data:SpareAction){return request<boolean>("/mes/dv/spare/return",{method:"POST",data:data as unknown as Record<string,unknown>,header:header(token)})}
export function getCardPage(token:string,params:{pageNo:number;pageSize:number;code?:string;workOrderCode?:string;status?:number}){return request<PageResult<TransferCard>>("/mes/pro/card/page"+query(params),{header:header(token)})}
export function getCard(token:string,id:number){return request<TransferCard>("/mes/pro/card/get"+query({id}),{header:header(token)})}
export function createCard(token:string,data:TransferCard){return request<number>("/mes/pro/card/create",{method:"POST",data:data as Record<string,unknown>,header:header(token)})}
export function updateCard(token:string,data:TransferCard){return request<boolean>("/mes/pro/card/update",{method:"PUT",data:data as Record<string,unknown>,header:header(token)})}
export function deleteCard(token:string,id:number){return request<boolean>("/mes/pro/card/delete"+query({id}),{method:"DELETE",header:header(token)})}
export function submitCard(token:string,id:number){return request<boolean>("/mes/pro/card/submit"+query({id}),{method:"PUT",header:header(token)})}
export function finishCard(token:string,id:number){return request<boolean>("/mes/pro/card/finish"+query({id}),{method:"PUT",header:header(token)})}
export function cancelCard(token:string,id:number){return request<boolean>("/mes/pro/card/cancel"+query({id}),{method:"PUT",header:header(token)})}
export function getCardProcessPage(token:string,params:{pageNo:number;pageSize:number;cardId:number}){return request<PageResult<TransferProcess>>("/mes/pro/card-process/page"+query(params),{header:header(token)})}
export function createCardProcess(token:string,data:TransferProcess){return request<number>("/mes/pro/card-process/create",{method:"POST",data:data as Record<string,unknown>,header:header(token)})}
export function updateCardProcess(token:string,data:TransferProcess){return request<boolean>("/mes/pro/card-process/update",{method:"PUT",data:data as Record<string,unknown>,header:header(token)})}
export function deleteCardProcess(token:string,id:number){return request<boolean>("/mes/pro/card-process/delete"+query({id}),{method:"DELETE",header:header(token)})}
src/api/production.ts
@@ -428,6 +428,21 @@
  return request<boolean>("/mes/pro/task/resume", { method: "PUT", data, header: header(accessToken) });
}
export interface BatchScheduleRequest {
  workOrderIds: number[]; startTime: string; previewHash?: string; previewTime?: string; allowLate?: boolean;
}
export interface BatchSchedulePreview {
  canExecute: boolean; previewHash: string; previewTime: string; warnings: string[];
  orders: Array<{ workOrderId: number; workOrderCode?: string; taskCount: number; endTime?: string; late: boolean; error?: string }>;
  tasks: Array<{ workOrderId: number; processId: number; processName: string; workstationName: string; quantity: number; startTime: string; endTime: string }>;
}
export function previewBatchSchedule(accessToken: string, data: BatchScheduleRequest) {
  return request<BatchSchedulePreview>("/mes/pro/task/auto-schedule/preview", { method: "POST", data, header: header(accessToken) });
}
export function executeBatchSchedule(accessToken: string, data: BatchScheduleRequest) {
  return request<{ taskIds: number[] }>("/mes/pro/task/auto-schedule", { method: "POST", data, header: header(accessToken) });
}
export function getFeedbackPage(accessToken: string, params: { pageNo: number; pageSize: number; code?: string; type?: number; workOrderId?: number; taskId?: number; itemId?: number; feedbackUserId?: number; creator?: string; status?: number }) {
  return request<PageResult<ProFeedback>>(`/mes/pro/feedback/page${query(params)}`, { header: header(accessToken) });
}
src/config/app-routes.ts
@@ -9,6 +9,8 @@
  "mes/dv/checkrecord/index": "/pages/mes/dv/checkrecord/index",
  "mes/dv/maintenrecord/index": "/pages/mes/dv/maintenrecord/index",
  "mes/dv/repair/index": "/pages/mes/dv/repair/index",
  "mes/dv/spare/index": "/pages/mes/dv/spare/index",
  "mes/dv/spare-record/index": "/pages/mes/dv/spare-record/index",
  "mes/dv/metering/index": "/pages/mes/dv/metering/index",
  "mes/dv/meteringcheck/index": "/pages/mes/dv/meteringcheck/index",
  "mes/process-design/parameter/index": "/pages/mes/process-design/parameter/index",
@@ -25,6 +27,7 @@
  "mes/pro/task/index": "/pages/mes/pro/task/index",
  "mes/pro/feedback/index": "/pages/mes/pro/feedback/index",
  "mes/pro/workrecord/index": "/pages/mes/pro/workrecord/index",
  "mes/pro/card/index": "/pages/mes/pro/card/index",
  "mes/qc/indicator/index": "/pages/mes/qc/indicator/index",
  "mes/qc/template/index": "/pages/mes/qc/template/index",
  "mes/qc/pendinginspect/index": "/pages/mes/qc/pendinginspect/index",
src/config/company.ts
@@ -18,7 +18,7 @@
/**
 * äº”套环境对照表。
 * - apiBaseUrl ç»Ÿä¸€ä»¥ `/admin-api` ç»“尾(yudao åŽå°æŽ¥å£å‰ç¼€ï¼‰ã€‚
 * - webBaseUrl:只有主分支是既有配置(9501);其余按主分支“接口端口 +1”的部署规律
 * - webBaseUrl:只有主分支(MOM æ™ºèƒ½æ™ºé€ ï¼‰æ˜¯æ—¢æœ‰é…ç½®ï¼ˆ9501);其余按主分支(MOM æ™ºèƒ½æ™ºé€ ï¼‰â€œæŽ¥å£ç«¯å£ +1”的部署规律
 *   æŽ¨å¯¼ï¼ˆ9500 â†’ 9501)。9017 / 9027 / 9025 å®žæµ‹èƒ½æ‰“开后台,1.95.78.124:9007 ç›®å‰è¿žä¸ä¸Š
 *   ï¼ˆä»…影响报表 / å¤§å±é¡µï¼‰ï¼Œéœ€è¦æ—¶æ¢æˆå®žé™…地址即可。
 * - åŒä»å ‚暂无专属首页,先复用 classic;有设计稿后加一个 HomeVariant å†æ”¹è¿™ä¸€åˆ—。
@@ -26,7 +26,7 @@
export const COMPANY_PROFILES: Record<CompanyCode, AppCompanyConfig> = {
  main: {
    key: "main",
    name: "主分支",
    name: "MOM æ™ºèƒ½æ™ºé€ ",
    homeVariant: "classic",
    apiBaseUrl: "http://36.213.90.123:9500/admin-api",
    webBaseUrl: "http://36.213.90.123:9501",
@@ -62,6 +62,6 @@
};
/** â˜… æ‰“包开关:只改这一行 */
export const ACTIVE_COMPANY: CompanyCode = "trt";
export const ACTIVE_COMPANY: CompanyCode = "main";
export const APP_COMPANY: AppCompanyConfig = COMPANY_PROFILES[ACTIVE_COMPANY];
src/pages.json
@@ -790,6 +790,30 @@
          }
        },
        {
          "path": "spare/index",
          "style": {
            "navigationBarTitleText": "备件台账"
          }
        },
        {
          "path": "spare/form",
          "style": {
            "navigationBarTitleText": "备件编辑"
          }
        },
        {
          "path": "spare/action",
          "style": {
            "navigationBarTitleText": "备件出入库"
          }
        },
        {
          "path": "spare-record/index",
          "style": {
            "navigationBarTitleText": "领用记录"
          }
        },
        {
          "path": "metering/index",
          "style": {
            "navigationBarTitleText": "计量器具"
@@ -1059,6 +1083,18 @@
          "style": {
            "navigationBarTitleText": "工作记录"
          }
        },
        {
          "path": "card/index",
          "style": {
            "navigationBarTitleText": "工序流转"
          }
        },
        {
          "path": "card/form",
          "style": {
            "navigationBarTitleText": "流转卡"
          }
        }
      ]
    },
src/pages/aftersales/list.scss
@@ -1,5 +1,5 @@
.page{min-height:100vh;padding:20rpx 30rpx 150rpx;box-sizing:border-box;background:#f3f6fb}
.scene-tabs{display:flex;gap:12rpx;margin-bottom:16rpx;overflow-x:auto}.scene-tabs text{flex:none;padding:12rpx 22rpx;color:#66778c;font-size:24rpx;background:#fff;border:1rpx solid #e2e8f0;border-radius:999rpx}.scene-tabs .active{color:#1769d8;background:#edf5ff;border-color:#9fc2ef}
.scene-tabs{height:88rpx;margin-bottom:0;white-space:nowrap}.scene-tabs text{display:inline-block;padding:27rpx 20rpx 18rpx;color:#718198;font-size:27rpx}.scene-tabs .active{color:#1769d8;font-weight:600;border-bottom:4rpx solid #1769d8}
.search{display:flex;align-items:center;height:80rpx;padding:0 20rpx;margin-bottom:18rpx;background:#fff;border-radius:12rpx}.search input{min-width:0;flex:1;font-size:27rpx}.search text{padding-left:18rpx;color:#1769d8;font-size:24rpx}
.card{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:14rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.07)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head-main{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.sub{color:#78879b;font-size:23rpx}
.tag{display:inline-flex;flex:none;align-items:center;height:42rpx;padding:0 15rpx;font-size:22rpx;border-radius:999rpx}.tag-blue{color:#1769d8;background:#eef6ff}.tag-green{color:#0e9663;background:#e9fbf2}.tag-orange{color:#c26a12;background:#fff4e7}.tag-danger{color:#c65050;background:#fff0f0}.tag-gray{color:#66778c;background:#f0f3f7}
src/pages/energy/record/index.vue
@@ -103,5 +103,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.search text{flex:none;color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{overflow:hidden;color:#78879b;font-size:23rpx;text-overflow:ellipsis;white-space:nowrap}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.tag-blue{color:#1769d8;background:#eef6ff;border:1rpx solid #c9e1ff}.tag-orange{color:#b06a00;background:#fff6df;border:1rpx solid #f0d390}.tag-green{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.search text{flex:none;color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{overflow:hidden;color:#78879b;font-size:23rpx;text-overflow:ellipsis;white-space:nowrap}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.tag-blue{color:#1769d8;background:#eef6ff;border:1rpx solid #c9e1ff}.tag-orange{color:#b06a00;background:#fff6df;border:1rpx solid #f0d390}.tag-green{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/hrm/attendance-holiday/index.vue
@@ -1,6 +1,5 @@
<script setup lang="ts">
import HrmCrudPage, { type CrudConfig } from "../components/HrmCrudPage.vue";
import { createHoliday, deleteHoliday, downloadHrmFile, getHolidayPage, updateHoliday } from "../../../api/hrm";
import { createHoliday, deleteHoliday, getHolidayPage, updateHoliday } from "../../../api/hrm";
const config: CrudConfig = { title:"节假日", permission:"hrm:attendance-holiday", fields:[{key:"name",label:"节假日名称",required:true},{key:"startDate",label:"开始日期",required:true},{key:"endDate",label:"结束日期",required:true},{key:"type",label:"类型",type:"number"},{key:"isLegal",label:"法定节假日",type:"number"},{key:"remark",label:"备注"}], cardFields:[{key:"name",label:"名称"},{key:"startDate",label:"开始日期"},{key:"endDate",label:"结束日期"},{key:"typeName",label:"类型"},{key:"isLegal",label:"是否法定"}], load:(t,k)=>getHolidayPage(t,{pageNo:1,pageSize:100,name:k||undefined}), create:createHoliday, update:updateHoliday, remove:deleteHoliday };
config.exportData = (token, keyword) => downloadHrmFile(token, "/hrm/attendance/holiday/export-excel", { name: keyword || undefined });
</script><template><HrmCrudPage :config="config" /></template>
src/pages/hrm/attendance-record/index.vue
@@ -1,7 +1,7 @@
<script setup lang="ts">
import { computed, ref } from "vue"; import { onPullDownRefresh, onShow } from "@dcloudio/uni-app";
import { getAttendanceRecordPage, type AttendanceRecord } from "../../../api/hrm"; import { useAuth } from "../../../stores/auth"; import { toast } from "../shared";
const {hasPermission,state}=useAuth(); const rows=ref<AttendanceRecord[]>([]), keyword=ref(""), date=ref(""), loading=ref(false); const canQuery=computed(()=>hasPermission("hrm:attendance-record:query"));
async function load(){if(!state.accessToken||!canQuery.value||loading.value)return;loading.value=true;try{const d=await getAttendanceRecordPage(state.accessToken,{pageNo:1,pageSize:100,userName:keyword.value||undefined,date:date.value||undefined});rows.value=d.list||[];}catch(e){toast(e instanceof Error?e.message:"加载失败");}finally{loading.value=false;uni.stopPullDownRefresh();}}
const {hasPermission,state}=useAuth(); const rows=ref<AttendanceRecord[]>([]), keyword=ref(""), loading=ref(false); const canQuery=computed(()=>hasPermission("hrm:attendance-record:query"));
async function load(){if(!state.accessToken||!canQuery.value||loading.value)return;loading.value=true;try{const d=await getAttendanceRecordPage(state.accessToken,{pageNo:1,pageSize:100,userName:keyword.value||undefined});rows.value=d.list||[];}catch(e){toast(e instanceof Error?e.message:"加载失败");}finally{loading.value=false;uni.stopPullDownRefresh();}}
onShow(load);onPullDownRefresh(load);
</script><template><view class="page"><template v-if="canQuery"><view class="search"><input v-model="keyword" placeholder="搜索员工姓名" @confirm="load"/><text @click="load">搜索</text></view><view class="search date"><input v-model="date" placeholder="考勤日期 YYYY-MM-DD" @confirm="load"/><text @click="date='';load()">清除</text></view><view v-for="row in rows" :key="row.id" class="card"><view class="head"><view class="head-main"><text class="name">{{row.userName||'--'}}</text><text class="sub">{{row.deptName||'--'}} Â· {{row.date||'--'}}</text></view><text class="tag tag-blue">{{row.dataSourceName||'考勤'}}</text></view><view class="grid"><text>上班:{{row.clockInTime||'--'}}</text><text>下班:{{row.clockOutTime||'--'}}</text><text>上班状态:{{row.clockInTypeName||'--'}}</text><text>下班状态:{{row.clockOutTypeName||'--'}}</text><text>工时:{{row.workHours??0}} å°æ—¶</text><text>加班:{{row.overtimeHours??0}} å°æ—¶</text><text>地点:{{row.location||'--'}}</text></view></view><view v-if="!rows.length" class="state">{{loading?'加载中...':'暂无考勤记录'}}</view></template><view v-else class="state">暂无考勤记录查看权限</view></view></template><style scoped lang="scss">@import "../list.scss";.date{margin-top:-10rpx}</style>
</script><template><view class="page"><template v-if="canQuery"><view class="search"><input v-model="keyword" placeholder="搜索员工姓名" @confirm="load"/><text @click="load">搜索</text></view><view v-for="row in rows" :key="row.id" class="card"><view class="head"><view class="head-main"><text class="name">{{row.userName||'--'}}</text><text class="sub">{{row.deptName||'--'}} Â· {{row.date||'--'}}</text></view><text class="tag tag-blue">{{row.dataSourceName||'考勤'}}</text></view><view class="grid"><text>上班:{{row.clockInTime||'--'}}</text><text>下班:{{row.clockOutTime||'--'}}</text><text>上班状态:{{row.clockInTypeName||'--'}}</text><text>下班状态:{{row.clockOutTypeName||'--'}}</text><text>工时:{{row.workHours??0}} å°æ—¶</text><text>加班:{{row.overtimeHours??0}} å°æ—¶</text><text>地点:{{row.location||'--'}}</text></view></view><view v-if="!rows.length" class="state">{{loading?'加载中...':'暂无考勤记录'}}</view></template><view v-else class="state">暂无考勤记录查看权限</view></view></template><style scoped lang="scss">@import "../list.scss";</style>
src/pages/hrm/attendance-rule/index.vue
@@ -1,6 +1,5 @@
<script setup lang="ts">
import HrmCrudPage, { type CrudConfig } from "../components/HrmCrudPage.vue";
import { createAttendanceRule, deleteAttendanceRule, downloadHrmFile, getAttendanceRulePage, updateAttendanceRule } from "../../../api/hrm";
import { createAttendanceRule, deleteAttendanceRule, getAttendanceRulePage, updateAttendanceRule } from "../../../api/hrm";
const config: CrudConfig = { title:"考勤规则", permission:"hrm:attendance-rule", fields:[{key:"name",label:"规则名称",required:true},{key:"deptId",label:"部门ID",type:"number"},{key:"workStartTime",label:"上班时间",required:true},{key:"workEndTime",label:"下班时间",required:true},{key:"lateAllowMinutes",label:"迟到宽限(分钟)",type:"number"},{key:"earlyAllowMinutes",label:"早退宽限(分钟)",type:"number"},{key:"overtimeThreshold",label:"加班起算(分钟)",type:"number"},{key:"locationName",label:"打卡地点"},{key:"locationAddress",label:"地点地址"},{key:"longitude",label:"经度",type:"number"},{key:"latitude",label:"纬度",type:"number"},{key:"radiusMeters",label:"有效范围(ç±³)",type:"number"},{key:"locationRequired",label:"必须在范围内",type:"switch"},{key:"remark",label:"备注"}], cardFields:[{key:"name",label:"名称"},{key:"deptName",label:"部门"},{key:"workStartTime",label:"上班"},{key:"workEndTime",label:"下班"},{key:"locationName",label:"打卡地点"},{key:"radiusMeters",label:"范围(ç±³)"}], load:(t,k)=>getAttendanceRulePage(t,{pageNo:1,pageSize:100,name:k||undefined}), create:createAttendanceRule, update:updateAttendanceRule, remove:deleteAttendanceRule };
config.exportData = (token, keyword) => downloadHrmFile(token, "/hrm/attendance/rule/export-excel", { name: keyword || undefined });
</script><template><HrmCrudPage :config="config" /></template>
src/pages/hrm/components/HrmCrudPage.vue
@@ -12,7 +12,7 @@
  create: (token: string, data: Record<string, unknown>) => Promise<unknown>;
  update: (token: string, data: Record<string, unknown>) => Promise<unknown>;
  remove: (token: string, id: number) => Promise<unknown>;
  exportData?: (token: string, keyword: string) => Promise<unknown>;
}
const props = defineProps<{ config: CrudConfig }>();
const { hasPermission, state } = useAuth();
@@ -51,11 +51,6 @@
  try { await props.config.remove(state.accessToken, Number(row.id)); toast("删除成功"); await load(); }
  catch (error) { toast(error instanceof Error ? error.message : "删除失败"); }
}
async function exportData() {
  if (!state.accessToken || !props.config.exportData) return;
  try { await props.config.exportData(state.accessToken, keyword.value.trim()); toast("导出文件已打开"); }
  catch (error) { toast(error instanceof Error ? error.message : "导出失败"); }
}
onShow(load); onPullDownRefresh(load);
</script>
@@ -63,7 +58,6 @@
  <view class="page">
    <template v-if="state.accessToken && canQuery">
      <view class="search"><input v-model="keyword" :placeholder="`搜索${config.title}`" confirm-type="search" @confirm="load" /><text @click="load">搜索</text></view>
      <view v-if="config.exportData && hasPermission(`${config.permission}:export`)" class="export-row"><button @click="exportData">导出</button></view>
      <view v-for="row in rows" :key="Number(row.id)" class="card">
        <view class="head"><view class="head-main"><text class="name">{{ text(row[config.cardFields[0]?.key]) }}</text><text class="sub">{{ config.title }}</text></view><text class="tag tag-blue">{{ row.status === 1 ? "停用" : "启用" }}</text></view>
        <view class="grid"><text v-for="item in config.cardFields.slice(1)" :key="item.key">{{ item.label }}:{{ text(row[item.key]) }}</text></view>
@@ -90,5 +84,4 @@
@import "../list.scss";
@import "../form.scss";
.mask{position:fixed;z-index:30;inset:0;display:flex;align-items:flex-end;background:rgba(16,31,51,.48)}.editor{width:100%;max-height:86vh;overflow:auto;padding:24rpx 30rpx 48rpx;background:#f6f7f9;border-radius:24rpx 24rpx 0 0}.editor-title{display:flex;justify-content:space-between;padding:10rpx 4rpx 24rpx;color:#20334c;font-size:30rpx;font-weight:600}.editor-title text:last-child{font-size:40rpx;font-weight:400}.editor .field{background:#fff}.editor .field:first-of-type{border-radius:14rpx 14rpx 0 0}.editor .field input{text-align:right}.editor switch{margin-left:auto}
.export-row{display:flex;justify-content:flex-end;margin:-8rpx 0 16rpx}.export-row button{margin:0;color:#1769d8;font-size:24rpx;background:#fff}
</style>
src/pages/hrm/schedule/index.vue
@@ -1,16 +1,15 @@
<script setup lang="ts">
import { computed, ref } from "vue";
import { ref } from "vue";
import { onShow } from "@dcloudio/uni-app";
import { getEmployeePage, getEmployeeScheduleList, getShiftList, saveEmployeeSchedule, type Employee, type EmployeeSchedule, type Shift } from "../../../api/hrm";
import { useAuth } from "../../../stores/auth";
import PickerSheet from "../../mes/process-design/components/PickerSheet.vue";
import { toast } from "../shared";
const { hasPermission, state } = useAuth();
const { state } = useAuth();
const period = ref(new Date().toISOString().slice(0, 7)); const employees = ref<Employee[]>([]); const shifts = ref<Shift[]>([]); const rows = ref<EmployeeSchedule[]>([]);
const employeeVisible = ref(false); const shiftVisible = ref(false); const selectedEmployee = ref<number>(); const date = ref(""); const selectedShift = ref<number>(); const saving = ref(false);
const canQuery = computed(() => hasPermission("hrm:schedule:query"));
async function load() {
  if (!state.accessToken || !canQuery.value) return;
  if (!state.accessToken) return;
  try {
    const [employeeData, shiftData, scheduleData] = await Promise.all([getEmployeePage(state.accessToken, { pageNo: 1, pageSize: 100 }), getShiftList(state.accessToken), getEmployeeScheduleList(state.accessToken, { yearMonth: period.value })]);
    employees.value = employeeData.list || []; shifts.value = shiftData; rows.value = scheduleData;
@@ -33,5 +32,5 @@
}
onShow(load);
</script>
<template><view class="page"><template v-if="canQuery"><view class="form-card"><view class="field"><text>排班月份</text><input v-model="period" placeholder="YYYY-MM" @confirm="load" /></view><view class="field"><text>员工</text><view class="picker" @click="employeeVisible = true"><text>{{ employees.find(item => item.id === selectedEmployee)?.name || "请选择员工" }}</text><text>›</text></view></view><view class="field"><text>日期</text><input v-model="date" placeholder="YYYY-MM-DD" /></view><view class="field"><text>班次</text><view class="picker" @click="shiftVisible = true"><text>{{ shifts.find(item => item.id === selectedShift)?.name || "休息/清除" }}</text><text>›</text></view></view><button class="save" :loading="saving" @click="saveDay">保存当天排班</button></view><view v-for="row in rows" :key="`${row.employeeId}-${row.date}`" class="card"><view class="head"><view class="head-main"><text class="name">{{ row.employeeName || "--" }}</text><text class="sub">{{ row.employeeNo || "--" }} Â· {{ row.date }}</text></view><text class="tag tag-blue">{{ row.shiftName || "休息" }}</text></view><view class="actions"><button class="danger" @click="clear(row)">清除当天</button></view></view><view v-if="!rows.length" class="state">暂无排班数据</view></template><view v-else class="state">暂无排班查看权限</view><PickerSheet v-model:show="employeeVisible" title="选择员工" :items="employees.map(item => ({ key: item.id || 0, label: item.name || '--', sub: item.employeeNo }))" :selected-keys="selectedEmployee ? [selectedEmployee] : []" @confirm="keys => selectedEmployee = Number(keys[0])" /><PickerSheet v-model:show="shiftVisible" title="选择班次" :items="[{ key: 0, label: '休息/清除' }, ...shifts.map(item => ({ key: item.id || 0, label: item.name || '--', sub: `${item.startTime}-${item.endTime}` }))]" :selected-keys="[selectedShift || 0]" @confirm="keys => selectedShift = Number(keys[0]) || undefined" /></view></template>
<template><view class="page"><template v-if="state.accessToken"><view class="form-card"><view class="field"><text>排班月份</text><input v-model="period" placeholder="YYYY-MM" @confirm="load" /></view><view class="field"><text>员工</text><view class="picker" @click="employeeVisible = true"><text>{{ employees.find(item => item.id === selectedEmployee)?.name || "请选择员工" }}</text><text>›</text></view></view><view class="field"><text>日期</text><input v-model="date" placeholder="YYYY-MM-DD" /></view><view class="field"><text>班次</text><view class="picker" @click="shiftVisible = true"><text>{{ shifts.find(item => item.id === selectedShift)?.name || "休息/清除" }}</text><text>›</text></view></view><button class="save" :loading="saving" @click="saveDay">保存当天排班</button></view><view v-for="row in rows" :key="`${row.employeeId}-${row.date}`" class="card"><view class="head"><view class="head-main"><text class="name">{{ row.employeeName || "--" }}</text><text class="sub">{{ row.employeeNo || "--" }} Â· {{ row.date }}</text></view><text class="tag tag-blue">{{ row.shiftName || "休息" }}</text></view><view class="actions"><button class="danger" @click="clear(row)">清除当天</button></view></view><view v-if="!rows.length" class="state">暂无排班数据</view></template><view v-else class="state">请先登录后查看排班</view><PickerSheet v-model:show="employeeVisible" title="选择员工" :items="employees.map(item => ({ key: item.id || 0, label: item.name || '--', sub: item.employeeNo }))" :selected-keys="selectedEmployee ? [selectedEmployee] : []" @confirm="keys => selectedEmployee = Number(keys[0])" /><PickerSheet v-model:show="shiftVisible" title="选择班次" :items="[{ key: 0, label: '休息/清除' }, ...shifts.map(item => ({ key: item.id || 0, label: item.name || '--', sub: `${item.startTime}-${item.endTime}` }))]" :selected-keys="[selectedShift || 0]" @confirm="keys => selectedShift = Number(keys[0]) || undefined" /></view></template>
<style scoped lang="scss">@import "../list.scss";@import "../form.scss";.form-card{padding-bottom:20rpx;margin-bottom:24rpx}.form-card .save{margin:22rpx 24rpx 0}.field input{text-align:right}</style>
src/pages/hrm/shift/index.vue
@@ -1,6 +1,6 @@
<script setup lang="ts">
import HrmCrudPage, { type CrudConfig } from "../components/HrmCrudPage.vue";
import { createShift, deleteShift, downloadHrmFile, getShiftPage, updateShift } from "../../../api/hrm";
import { createShift, deleteShift, getShiftPage, updateShift } from "../../../api/hrm";
const config: CrudConfig = { title:"班次", permission:"hrm:shift", fields:[{key:"name",label:"班次名称",required:true},{key:"startTime",label:"上班时间",required:true},{key:"endTime",label:"下班时间",required:true},{key:"workHours",label:"标准工时",type:"number",required:true},{key:"crossDay",label:"是否跨天",type:"switch"},{key:"color",label:"标签颜色"},{key:"remark",label:"备注"}], cardFields:[{key:"name",label:"名称"},{key:"startTime",label:"上班时间"},{key:"endTime",label:"下班时间"},{key:"workHours",label:"标准工时"},{key:"crossDay",label:"跨天"}], load:(t,k)=>getShiftPage(t,{pageNo:1,pageSize:100,name:k||undefined}), create:createShift, update:updateShift, remove:deleteShift };
config.exportData = (token, keyword) => downloadHrmFile(token, "/hrm/shift/export-excel", { name: keyword || undefined });
</script><template><HrmCrudPage :config="config" /></template>
src/pages/mes/cal/plan/index.vue
@@ -87,5 +87,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;color:#1769d8;font-size:22rpx;background:#edf5ff;border:1rpx solid #bfdbff;border-radius:999rpx}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;color:#1769d8;font-size:22rpx;background:#edf5ff;border:1rpx solid #bfdbff;border-radius:999rpx}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/cal/team/index.vue
@@ -82,5 +82,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tag-approved{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tag-approved{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/dv/checkplan/index.vue
@@ -60,5 +60,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;color:#1769d8;background:#eef5ff;border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;color:#1769d8;background:#eef5ff;border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/dv/machinery/index.vue
@@ -185,5 +185,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 24rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 14rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.main-layout{height:0;min-height:0;flex:1;display:flex;gap:16rpx;padding-bottom:150rpx;box-sizing:border-box}.type-nav{width:188rpx;height:100%;flex:none;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.05)}.type-item{position:relative;display:flex;align-items:center;gap:4rpx;min-height:78rpx;padding:14rpx 12rpx 14rpx 16rpx;box-sizing:border-box;color:#617287;font-size:23rpx;border-bottom:1rpx solid #edf1f6}.type-item:last-child{border-bottom:0}.tree-arrow{width:24rpx;height:34rpx;flex:none;opacity:0}.tree-arrow.show{position:relative;opacity:1}.tree-arrow.show::after{position:absolute;top:11rpx;left:5rpx;width:12rpx;height:12rpx;box-sizing:border-box;border-right:3rpx solid #7a8a9d;border-bottom:3rpx solid #7a8a9d;content:"";transform:rotate(-45deg)}.tree-arrow.open::after{transform:rotate(45deg)}.type-item text{display:-webkit-box;min-width:0;overflow:hidden;line-height:1.25;text-overflow:ellipsis;-webkit-line-clamp:2;-webkit-box-orient:vertical}.type-item.active{color:#1769d8;font-weight:600;background:#eef5ff}.type-item.active::before{position:absolute;top:18rpx;bottom:18rpx;left:0;width:6rpx;background:#1769d8;border-radius:0 6rpx 6rpx 0;content:""}.type-item.active .tree-arrow.show::after{border-color:#1769d8}.content{height:100%;min-width:0;flex:1;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:center;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view text:last-child{overflow:hidden;color:#78879b;font-size:23rpx;text-overflow:ellipsis;white-space:nowrap}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;font-size:22rpx!important;border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.running{color:#1c9b68;background:#e8f8f0}.maintain{color:#d78321;background:#fff3df}.stopped{color:#8d9bad;background:#f0f3f6}.grid{display:grid;grid-template-columns:1fr;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;color:#fff;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}
.page{height:100vh;display:flex;flex-direction:column;padding:0 24rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 14rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.main-layout{height:0;min-height:0;flex:1;display:flex;gap:16rpx;padding-bottom:150rpx;box-sizing:border-box}.type-nav{width:188rpx;height:100%;flex:none;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.05)}.type-item{position:relative;display:flex;align-items:center;gap:4rpx;min-height:78rpx;padding:14rpx 12rpx 14rpx 16rpx;box-sizing:border-box;color:#617287;font-size:23rpx;border-bottom:1rpx solid #edf1f6}.type-item:last-child{border-bottom:0}.tree-arrow{width:24rpx;height:34rpx;flex:none;opacity:0}.tree-arrow.show{position:relative;opacity:1}.tree-arrow.show::after{position:absolute;top:11rpx;left:5rpx;width:12rpx;height:12rpx;box-sizing:border-box;border-right:3rpx solid #7a8a9d;border-bottom:3rpx solid #7a8a9d;content:"";transform:rotate(-45deg)}.tree-arrow.open::after{transform:rotate(45deg)}.type-item text{display:-webkit-box;min-width:0;overflow:hidden;line-height:1.25;text-overflow:ellipsis;-webkit-line-clamp:2;-webkit-box-orient:vertical}.type-item.active{color:#1769d8;font-weight:600;background:#eef5ff}.type-item.active::before{position:absolute;top:18rpx;bottom:18rpx;left:0;width:6rpx;background:#1769d8;border-radius:0 6rpx 6rpx 0;content:""}.type-item.active .tree-arrow.show::after{border-color:#1769d8}.content{height:100%;min-width:0;flex:1;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:center;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view text:last-child{overflow:hidden;color:#78879b;font-size:23rpx;text-overflow:ellipsis;white-space:nowrap}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;font-size:22rpx!important;border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.running{color:#1c9b68;background:#e8f8f0}.maintain{color:#d78321;background:#fff3df}.stopped{color:#8d9bad;background:#f0f3f6}.grid{display:grid;grid-template-columns:1fr;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;color:#fff;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/dv/machinery/type/index.vue
@@ -129,5 +129,5 @@
</template>
<style lang="scss" scoped>
  .page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.tree{overflow:hidden;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.row{display:flex;align-items:center;gap:12rpx;min-height:94rpx;padding:14rpx 18rpx 14rpx 22rpx;box-sizing:border-box;border-bottom:1rpx solid #edf1f7}.row:last-child{border-bottom:0}.main{display:flex;align-items:center;min-width:0;flex:1;gap:12rpx}.arrow{width:18rpx;height:18rpx;flex:none;opacity:0;border-right:4rpx solid #637891;border-bottom:4rpx solid #637891;transform:rotate(-45deg)}.arrow.show{opacity:1}.arrow.open{transform:rotate(45deg)}.info{display:flex;min-width:0;flex:1;flex-direction:column;gap:6rpx}.title-line{display:flex;align-items:center;gap:10rpx;min-width:0}.name{overflow:hidden;color:#20334c;font-size:29rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.title-line .name{flex:1}.info>text{overflow:hidden;color:#78879b;font-size:22rpx;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;font-size:22rpx!important;border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.actions{display:flex;flex:none;flex-wrap:wrap;justify-content:flex-end;gap:8rpx}.actions button{min-height:50rpx;padding:0 14rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.state{display:block;padding:70rpx 20rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;color:#fff;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}
  .page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.tree{overflow:hidden;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.row{display:flex;align-items:center;gap:12rpx;min-height:94rpx;padding:14rpx 18rpx 14rpx 22rpx;box-sizing:border-box;border-bottom:1rpx solid #edf1f7}.row:last-child{border-bottom:0}.main{display:flex;align-items:center;min-width:0;flex:1;gap:12rpx}.arrow{width:18rpx;height:18rpx;flex:none;opacity:0;border-right:4rpx solid #637891;border-bottom:4rpx solid #637891;transform:rotate(-45deg)}.arrow.show{opacity:1}.arrow.open{transform:rotate(45deg)}.info{display:flex;min-width:0;flex:1;flex-direction:column;gap:6rpx}.title-line{display:flex;align-items:center;gap:10rpx;min-width:0}.name{overflow:hidden;color:#20334c;font-size:29rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.title-line .name{flex:1}.info>text{overflow:hidden;color:#78879b;font-size:22rpx;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;font-size:22rpx!important;border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.actions{display:flex;flex:none;flex-wrap:wrap;justify-content:flex-end;gap:8rpx}.actions button{min-height:50rpx;padding:0 14rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.state{display:block;padding:70rpx 20rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;color:#fff;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/dv/maintenrecord/index.vue
@@ -14,5 +14,5 @@
</script>
<template><view class="page"><template v-if="isLoggedIn"><view v-if="canQuery" class="search"><input v-model="keyword" placeholder="搜索设备名称" confirm-type="search" @confirm="load(true)" /><text v-if="keyword" @click="keyword='';load(true)">清除</text></view><scroll-view v-if="canQuery" class="content" scroll-y lower-threshold="80" @scrolltolower="hasMore&&load()"><view v-if="loadError" class="state error" @click="load(true)">{{loadError}},点击重试</view><view v-else-if="rows.length"><view v-for="item in rows" :key="item.id" class="row" @click="go(item.id,'detail')"><view class="head"><view><text class="name">{{item.machineryName||'未命名设备'}}</text><text>{{item.machineryCode||'暂无编码'}}</text></view><view class="status-wrap"><text :class="['status', item.status === 20 ? 'enabled' : 'disabled']">{{dictLabel(dicts,'mes_mainten_record_status',item.status)}}</text></view></view><view class="grid"><text>计划名称:{{item.planName||'--'}}</text><text>保养时间:{{dateText(item.maintenTime)}}</text><text>保养人:{{item.nickname||'--'}}</text><text>创建时间:{{dateText(item.createTime)}}</text></view><view class="actions"><button v-if="canQuery" @click.stop="go(item.id,'detail')">详情</button><button v-if="canUpdate&&item.status===10" @click.stop="go(item.id)">编辑</button><button v-if="canUpdate&&item.status===10" @click.stop="action(item,'submit')">提交</button><button v-if="canDelete&&item.status===10" class="danger" @click.stop="action(item,'delete')">删除</button></view></view><text class="more">{{loading?'加载中...':hasMore?'上拉加载更多':'没有更多了'}}</text></view><view v-else class="state">{{loading?'加载中...':keyword?'没有匹配的记录':'暂无保养记录'}}</view></scroll-view><view v-else class="state">暂无保养记录查看权限</view></template><view v-else class="state">登录后查看保养记录</view><button v-if="canCreate" class="fab" @click="go()"><view /></button></view></template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;color:#1769d8;background:#eef5ff;border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;color:#1769d8;background:#eef5ff;border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/dv/metering/index.vue
@@ -14,5 +14,5 @@
</script>
<template><view class="page"><template v-if="isLoggedIn"><view v-if="canQuery" class="search"><input v-model="keyword" placeholder="搜索器具名称" confirm-type="search" @confirm="load(true)" /><text v-if="keyword" @click="keyword='';load(true)">清除</text></view><scroll-view v-if="canQuery" class="content" scroll-y lower-threshold="80" @scrolltolower="hasMore&&load()"><view v-if="loadError" class="state error" @click="load(true)">{{loadError}},点击重试</view><view v-else-if="rows.length"><view v-for="item in rows" :key="item.id" class="row" @click="go(item.id,'detail')"><view class="head"><view><text class="name">{{item.name||'未命名器具'}}</text><text>{{item.code||'暂无编码'}}</text></view><view class="status-wrap"><text :class="['status', item.expireStatus === 0 ? 'enabled' : item.expireStatus === 1 ? 'warning' : 'danger']">{{dictLabel(dicts,'mes_dv_metering_expire_status',item.expireStatus)}}</text></view></view><view class="tags"><text>{{dictLabel(dicts,'mes_dv_metering_category',item.category)}}</text><text :class="item.status === 0 ? 'enabled' : 'disabled'">{{dictLabel(dicts,'mes_dv_metering_status',item.status)}}</text></view><view class="grid"><text>规格型号:{{item.specification||'--'}}</text><text>品牌/生产厂家:{{item.brand||'--'}}</text><text>使用部门:{{item.deptName||'--'}}</text><text>责任人:{{item.chargeUserNickname||'--'}}</text><text>下次检测日期:{{dayText(item.nextCheckDate)}}</text><text>创建时间:{{dateText(item.createTime)}}</text></view><view class="actions"><button v-if="canQuery" @click.stop="go(item.id,'detail')">详情</button><button v-if="canUpdate" @click.stop="go(item.id)">编辑</button><button v-if="canDelete" class="danger" @click.stop="remove(item)">删除</button></view></view><text class="more">{{loading?'加载中...':hasMore?'上拉加载更多':'没有更多了'}}</text></view><view v-else class="state">{{loading?'加载中...':keyword?'没有匹配的器具':'暂无计量器具'}}</view></scroll-view><view v-else class="state">暂无计量器具查看权限</view></template><view v-else class="state">登录后查看计量器具</view><button v-if="canCreate" class="fab" @click="go()"><view /></button></view></template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;color:#1769d8;background:#eef5ff;border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;color:#1769d8;background:#eef5ff;border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/dv/meteringcheck/index.vue
@@ -14,5 +14,5 @@
</script>
<template><view class="page"><template v-if="isLoggedIn"><view v-if="canQuery" class="search"><input v-model="keyword" placeholder="搜索检测编号" confirm-type="search" @confirm="load(true)" /><text v-if="keyword" @click="keyword='';load(true)">清除</text></view><scroll-view v-if="canQuery" class="content" scroll-y lower-threshold="80" @scrolltolower="hasMore&&load()"><view v-if="loadError" class="state error" @click="load(true)">{{loadError}},点击重试</view><view v-else-if="rows.length"><view v-for="item in rows" :key="item.id" class="row" @click="go(item.id,'detail')"><view class="head"><view><text class="name">{{item.checkCode||'检测记录'}}</text><text>{{item.meteringName||item.meteringCode||'计量器具'}}</text></view><view class="status-wrap"><text :class="['status', item.checkResult === 1 ? 'enabled' : 'danger']">{{dictLabel(dicts,'mes_dv_metering_check_result',item.checkResult)}}</text></view></view><view class="grid"><text>器具编码:{{item.meteringCode||'--'}}</text><text>检测日期:{{dayText(item.checkDate)}}</text><text>检测机构:{{item.checkOrg||'--'}}</text><text>证书编号:{{item.certNo||'--'}}</text><text>检测人:{{item.checkUserNickname||'--'}}</text><text>下次检测日期:{{dayText(item.nextCheckDate)}}</text><text>创建时间:{{dateText(item.createTime)}}</text></view><view class="actions"><button v-if="canQuery" @click.stop="go(item.id,'detail')">详情</button><button v-if="canUpdate" @click.stop="go(item.id)">编辑</button><button v-if="canDelete" class="danger" @click.stop="remove(item)">删除</button></view></view><text class="more">{{loading?'加载中...':hasMore?'上拉加载更多':'没有更多了'}}</text></view><view v-else class="state">{{loading?'加载中...':keyword?'没有匹配的记录':'暂无计量检测记录'}}</view></scroll-view><view v-else class="state">暂无计量检测记录查看权限</view></template><view v-else class="state">登录后查看计量检测记录</view><button v-if="canCreate" class="fab" @click="go()"><view /></button></view></template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;color:#1769d8;background:#eef5ff;border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;color:#1769d8;background:#eef5ff;border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/dv/repair/index.vue
@@ -14,5 +14,5 @@
</script>
<template><view class="page"><template v-if="isLoggedIn"><view v-if="canQuery" class="search"><input v-model="keyword" placeholder="搜索维修单名称" confirm-type="search" @confirm="load(true)" /><text v-if="keyword" @click="keyword='';load(true)">清除</text></view><scroll-view v-if="canQuery" class="content" scroll-y lower-threshold="80" @scrolltolower="hasMore&&load()"><view v-if="loadError" class="state error" @click="load(true)">{{loadError}},点击重试</view><view v-else-if="rows.length"><view v-for="item in rows" :key="item.id" class="row" @click="go(item.id,'detail')"><view class="head"><view><text class="name">{{item.name||'未命名维修单'}}</text><text>{{item.code||'暂无编码'}}</text></view><view class="status-wrap"><text :class="['status', item.status === 10 ? 'disabled' : item.status === 40 ? 'enabled' : 'warning']">{{dictLabel(dicts,'mes_dv_repair_status',item.status)}}</text></view></view><view v-if="item.result" class="tags"><text :class="item.result === 1 ? 'enabled' : 'danger'">{{dictLabel(dicts,'mes_dv_repair_result',item.result)}}</text></view><view class="grid"><text>设备名称:{{item.machineryName||'--'}}</text><text>报修日期:{{dateText(item.requireDate)}}</text><text>完成日期:{{dateText(item.finishDate)}}</text><text>创建时间:{{dateText(item.createTime)}}</text></view><view class="actions"><button v-if="canQuery" @click.stop="go(item.id,'detail')">详情</button><button v-if="canUpdate&&item.status===10" @click.stop="go(item.id)">编辑</button><button v-if="canUpdate&&item.status===10" @click.stop="action(item,'submit')">提交</button><button v-if="canUpdate&&item.status===20" @click.stop="go(item.id,'confirm')">确认完成</button><button v-if="canUpdate&&item.status===30" @click.stop="action(item,'finishPass')">验收通过</button><button v-if="canUpdate&&item.status===30" @click.stop="action(item,'finishFail')">验收不通过</button><button v-if="canDelete&&item.status===10" class="danger" @click.stop="action(item,'delete')">删除</button></view></view><text class="more">{{loading?'加载中...':hasMore?'上拉加载更多':'没有更多了'}}</text></view><view v-else class="state">{{loading?'加载中...':keyword?'没有匹配的维修单':'暂无维修单'}}</view></scroll-view><view v-else class="state">暂无维修单查看权限</view></template><view v-else class="state">登录后查看维修单</view><button v-if="canCreate" class="fab" @click="go()"><view /></button></view></template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;color:#1769d8;background:#eef5ff;border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;color:#1769d8;background:#eef5ff;border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/dv/spare-record/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
<script setup lang="ts">
import { computed, reactive, ref } from "vue";
import { onLoad, onPullDownRefresh, onShow } from "@dcloudio/uni-app";
import { getSpareMovementPage, returnSpare, type SpareMovement } from "../../../../api/mes-operations";
import { useAuth } from "../../../../stores/auth";
const { hasPermission, isLoggedIn, state } = useAuth();
const sparePartId = ref<number>(), repairCode = ref(""), type = ref<number>(), rows = ref<SpareMovement[]>([]), loading = ref(false);
const selected = ref<SpareMovement>(), returnOpen = ref(false), form = reactive({ quantity: 1, remark: "" });
const labels: Record<number,string> = { 1:"初始库存", 2:"入库", 3:"维修领用", 4:"退回" };
const tones: Record<number,string> = { 1:"tag-info", 2:"tag-ok", 3:"tag-warning", 4:"tag-purple" };
const canQuery = computed(() => hasPermission("mes:dv-spare:record"));
const canReturn = computed(() => hasPermission("mes:dv-spare:return"));
async function load() {
  if (!state.accessToken || !canQuery.value || loading.value) return;
  loading.value = true;
  try {
    rows.value = (await getSpareMovementPage(state.accessToken, { pageNo:1, pageSize:100, sparePartId:sparePartId.value, repairCode:repairCode.value.trim() || undefined, type:type.value })).list;
  } catch (error) {
    uni.showToast({ title:error instanceof Error ? error.message : "记录加载失败", icon:"none" });
  } finally { loading.value = false; uni.stopPullDownRefresh(); }
}
function startReturn(row: SpareMovement) { selected.value=row; form.quantity=Number(row.returnableQuantity||1); form.remark=""; returnOpen.value=true; }
async function submitReturn() {
  if (!state.accessToken || !selected.value?.id || form.quantity<=0 || form.quantity>Number(selected.value.returnableQuantity) || !form.remark.trim()) return uni.showToast({title:"请填写正确数量和退回原因",icon:"none"});
  try {
    await returnSpare(state.accessToken,{requestKey:Date.now()+"-"+Math.random(),originalId:selected.value.id,quantity:Number(form.quantity),remark:form.remark});
    returnOpen.value=false; uni.showToast({title:"退回成功",icon:"success"}); await load();
  } catch(error) { uni.showToast({title:error instanceof Error?error.message:"退回失败",icon:"none"}); }
}
onLoad(query => { sparePartId.value=query.sparePartId?Number(query.sparePartId):undefined; });
onShow(load); onPullDownRefresh(load);
</script>
<template><view class="page">
  <template v-if="isLoggedIn">
    <view v-if="canQuery" class="search"><input v-model="repairCode" placeholder="搜索维修单号" confirm-type="search" @confirm="load" /><picker :range="['全部','初始库存','入库','维修领用','退回']" @change="type=$event.detail.value?Number($event.detail.value):undefined;load()"><view class="type-picker">{{type?labels[type]:'全部类型'}}<text>▾</text></view></picker></view>
    <scroll-view v-if="canQuery" class="content" scroll-y>
      <view v-for="row in rows" :key="row.id" class="row">
        <view class="head"><view><text class="name">{{row.sparePartName||'备件'}}</text><text>{{row.sparePartCode||'暂无编码'}}</text></view><view class="status-wrap"><text :class="['status',tones[Number(row.type)]]">{{labels[Number(row.type)]||'库存变动'}}</text></view></view>
        <view class="grid"><text>数量:{{row.quantity??0}} {{row.unit||''}}</text><text>库存:{{row.beforeQuantity??'--'}} â†’ {{row.afterQuantity??'--'}}</text><text>维修单:{{row.repairCode||'--'}}</text><text>设备:{{row.machineryName||'--'}}</text><text>领用人:{{row.receiverName||'--'}}</text><text>时间:{{row.createTime||'--'}}</text><text class="full">备注:{{row.remark||'--'}}</text></view>
        <view v-if="canReturn&&row.type===3&&Number(row.returnableQuantity)>0" class="actions"><button @click="startReturn(row)">退回(可退 {{row.returnableQuantity}})</button></view>
      </view>
      <view v-if="!rows.length" class="state">{{loading?'加载中...':'暂无领用记录'}}</view>
    </scroll-view>
    <view v-else class="state">暂无领用记录查看权限</view>
  </template>
  <view v-else class="state">登录后查看领用记录</view>
  <view v-if="returnOpen" class="mask" @click="returnOpen=false"><view class="sheet" @click.stop><view class="sheet-head"><text>备件退回</text><text @click="returnOpen=false">关闭</text></view><view class="field"><text>退回数量</text><input v-model.number="form.quantity" type="digit" /></view><view class="field column"><text>退回原因</text><textarea v-model="form.remark" placeholder="请输入退回原因" /></view><button class="save" @click="submitReturn">确认退回</button></view></view>
</view></template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}
.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.search picker{flex:none}.type-picker{display:flex;align-items:center;gap:8rpx;color:#1769d8;font-size:24rpx}.type-picker text{font-size:18rpx}
.content{height:0;flex:1;padding-bottom:60rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}
.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}
.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;line-height:36rpx;border-radius:999rpx;white-space:nowrap}.tag-info{color:#1769d8;background:#eef6ff;border:1rpx solid #c9e1ff}.tag-ok{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-warning{color:#b06a00;background:#fff6df;border:1rpx solid #f0d390}.tag-purple{color:#7a52c6;background:#f3edff;border:1rpx solid #d4c0ff}
.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.grid .full{grid-column:1/3}.actions{display:flex;justify-content:flex-end;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions button::after,.save::after{border:0}.state{display:block;padding:45rpx;color:#8795a8;font-size:26rpx;text-align:center}
.mask{position:fixed;inset:0;z-index:30;display:flex;align-items:flex-end;background:rgba(18,29,43,.42)}.sheet{width:100%;padding-bottom:40rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.sheet-head{display:flex;align-items:center;justify-content:space-between;height:92rpx;padding:0 30rpx;border-bottom:1rpx solid #edf1f6}.sheet-head text:first-child{color:#20334c;font-size:30rpx;font-weight:600}.sheet-head text:last-child{color:#1769d8;font-size:25rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 30rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text{width:180rpx;color:#33455d}.field input{flex:1;text-align:right}.column{align-items:flex-start;flex-direction:column;padding-top:20rpx}.column textarea{width:100%;height:120rpx}.save{margin:24rpx 30rpx 0;color:#fff;background:#1769d8;border-radius:12rpx}
</style>
src/pages/mes/dv/spare/action.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
<script setup lang="ts">
import{reactive,ref}from"vue";import{onLoad}from"@dcloudio/uni-app";import{getSpare,issueSpare,receiveSpare,type SpareAction,type SparePart}from"../../../../api/mes-operations";import{getRepairPage,type Repair}from"../../../../api/equipment";import{getHrmUserList,type UserOption}from"../../../../api/hrm";import{useAuth}from"../../../../stores/auth";const{state}=useAuth(),type=ref("receive"),spare=ref<SparePart>({}),repairs=ref<Repair[]>([]),users=ref<UserOption[]>([]),form=reactive<SpareAction>({requestKey:"",quantity:1,remark:""});async function save(){if(!state.accessToken||Number(form.quantity)<=0||!form.remark||(type.value==="issue"&&(!form.repairId||!form.receiverUserId)))return uni.showToast({title:"请完整填写必填项",icon:"none"});if(type.value==="issue"&&Number(form.quantity)>Number(spare.value.stockQuantity))return uni.showToast({title:"数量不能超过库存",icon:"none"});form.requestKey=Date.now()+"-"+Math.random();try{type.value==="receive"?await receiveSpare(state.accessToken,form):await issueSpare(state.accessToken,form);uni.showToast({title:"操作成功",icon:"success"});setTimeout(()=>uni.navigateBack(),400)}catch(e){uni.showToast({title:e instanceof Error?e.message:"操作失败",icon:"none"})}}onLoad(async q=>{type.value=q.type==="issue"?"issue":"receive";form.sparePartId=Number(q.sparePartId);if(!state.accessToken)return;spare.value=await getSpare(state.accessToken,form.sparePartId);if(type.value==="issue"){repairs.value=(await getRepairPage(state.accessToken,{pageNo:1,pageSize:100})).list;users.value=await getHrmUserList(state.accessToken)}});
</script><template><view class="page"><view class="card"><view class="field"><text>备件</text><text class="value">{{spare.name}}(库存 {{spare.stockQuantity??0}})</text></view><view v-if="type==='issue'" class="field"><text>维修单 *</text><picker :range="repairs" range-key="code" @change="form.repairId=repairs[$event.detail.value].id"><view class="value">{{repairs.find(x=>x.id===form.repairId)?.code||'请选择'}} â€º</view></picker></view><view v-if="type==='issue'" class="field"><text>领用人 *</text><picker :range="users" range-key="nickname" @change="form.receiverUserId=users[$event.detail.value].id"><view class="value">{{users.find(x=>x.id===form.receiverUserId)?.nickname||'请选择'}} â€º</view></picker></view><view class="field"><text>数量 *</text><input v-model.number="form.quantity" type="digit"/></view><view class="field col"><text>原因/备注 *</text><textarea v-model="form.remark"/></view></view><button class="save" @click="save">确认{{type==='receive'?'入库':'领用'}}</button></view></template><style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eee}.field>text:first-child{width:180rpx}.field input,.field picker,.value{flex:1;text-align:right}.col{align-items:flex-start;flex-direction:column;padding-block:20rpx}.col textarea{width:100%;height:130rpx}.save{margin-top:30rpx;color:#fff;background:#1769d8}.save::after{border:0}</style>
src/pages/mes/dv/spare/form.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
<script setup lang="ts">
import{computed,reactive,ref}from"vue";import{onLoad}from"@dcloudio/uni-app";import{createSpare,getSpare,updateSpare,type SpareSave}from"../../../../api/mes-operations";import{useAuth}from"../../../../stores/auth";const{hasPermission,state}=useAuth(),id=ref<number>(),mode=ref("edit"),saving=ref(false),form=reactive<SpareSave>({code:"",name:"",unit:"",specification:"",location:"",safetyQuantity:0,initialQuantity:0,status:1,remark:""});const readonly=computed(()=>mode.value==="detail"),canSave=computed(()=>id.value?hasPermission("mes:dv-spare:update"):hasPermission("mes:dv-spare:create"));async function save(){if(!state.accessToken||!canSave.value)return;if(!form.code||!form.name||!form.unit)return uni.showToast({title:"请填写编码、名称和单位",icon:"none"});saving.value=true;try{const d={...form,id:id.value,safetyQuantity:Number(form.safetyQuantity||0),initialQuantity:Number(form.initialQuantity||0)};id.value?await updateSpare(state.accessToken,d):id.value=await createSpare(state.accessToken,d);uni.showToast({title:"保存成功",icon:"success"});setTimeout(()=>uni.navigateBack(),400)}catch(e){uni.showToast({title:e instanceof Error?e.message:"保存失败",icon:"none"})}finally{saving.value=false}}onLoad(async q=>{id.value=q.id?Number(q.id):undefined;mode.value=q.mode||"edit";if(state.accessToken&&id.value)Object.assign(form,await getSpare(state.accessToken,id.value))});
</script><template><view class="page"><view class="card"><view class="field"><text>备件编码 *</text><input v-model="form.code" :disabled="readonly||!!id"/></view><view class="field"><text>备件名称 *</text><input v-model="form.name" :disabled="readonly"/></view><view class="field"><text>规格型号</text><input v-model="form.specification" :disabled="readonly"/></view><view class="field"><text>单位 *</text><input v-model="form.unit" :disabled="readonly"/></view><view class="field"><text>库位</text><input v-model="form.location" :disabled="readonly"/></view><view class="field"><text>安全库存 *</text><input v-model.number="form.safetyQuantity" :disabled="readonly" type="number"/></view><view v-if="!id" class="field"><text>初始库存</text><input v-model.number="form.initialQuantity" type="number"/></view><view v-else class="field"><text>当前库存</text><text class="value">{{form.stockQuantity??0}}</text></view><view class="field"><text>状态</text><switch :checked="form.status===1" :disabled="readonly" @change="form.status=$event.detail.value?1:0"/></view><view class="field col"><text>备注</text><textarea v-model="form.remark" :disabled="readonly"/></view></view><button v-if="!readonly&&canSave" class="save" :loading="saving" @click="save">保存</button></view></template><style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eee}.field>text:first-child{width:190rpx}.field input,.value{flex:1;text-align:right}.col{align-items:flex-start;flex-direction:column;padding-block:20rpx}.col textarea{width:100%;height:130rpx}.save{margin-top:30rpx;color:#fff;background:#1769d8}.save::after{border:0}</style>
src/pages/mes/dv/spare/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
<script setup lang="ts">
import{computed,ref}from"vue";import{onShow,onPullDownRefresh}from"@dcloudio/uni-app";import{deleteSpare,getSparePage,type SparePart}from"../../../../api/mes-operations";import{useAuth}from"../../../../stores/auth";
const{hasPermission,isLoggedIn,state}=useAuth(),keyword=ref(""),shortage=ref(false),rows=ref<SparePart[]>([]),loading=ref(false);const p=(x:string)=>hasPermission("mes:dv-spare:"+x),canQuery=computed(()=>p("query")),canCreate=computed(()=>p("create"));
async function load(){if(!state.accessToken||!canQuery.value||loading.value)return;loading.value=true;try{rows.value=(await getSparePage(state.accessToken,{pageNo:1,pageSize:100,name:keyword.value||undefined,shortageOnly:shortage.value||undefined})).list}catch(e){uni.showToast({title:e instanceof Error?e.message:"加载失败",icon:"none"})}finally{loading.value=false;uni.stopPullDownRefresh()}}function go(id?:number,mode="edit"){uni.navigateTo({url:"/pages/mes/dv/spare/form"+(id?"?id="+id+"&mode="+mode:"")})}function action(t:string,x:SparePart){uni.navigateTo({url:"/pages/mes/dv/spare/action?type="+t+"&sparePartId="+x.id})}async function remove(x:SparePart){if(!state.accessToken||!x.id)return;const ok=await new Promise<boolean>(r=>uni.showModal({title:"确认删除",content:"确定删除该备件吗?",success:v=>r(v.confirm)}));if(ok){await deleteSpare(state.accessToken,x.id);load()}}onShow(load);onPullDownRefresh(load);
</script><template><view class="page"><template v-if="isLoggedIn"><view v-if="canQuery" class="search"><input v-model="keyword" placeholder="搜索备件名称" @confirm="load"/><text @click="shortage=!shortage;load()">{{shortage?'全部库存':'仅看库存不足'}}</text></view><scroll-view v-if="canQuery" class="list" scroll-y><view v-for="x in rows" :key="x.id" class="row" @click="go(x.id,'detail')"><view class="head"><view><b>{{x.name||'未命名备件'}}</b><text>{{x.code||'暂无编码'}}</text></view><view class="status-wrap"><text :class="['status',x.status===1?'tag-ok':'tag-stop']">{{x.status===1?'启用':'停用'}}</text></view></view><view class="stock"><span>当前库存<b :class="{low:Number(x.stockQuantity)<Number(x.safetyQuantity)}">{{x.stockQuantity??0}}</b></span><span>安全库存<b>{{x.safetyQuantity??0}}</b></span><span>单位<b>{{x.unit||'--'}}</b></span></view><view class="meta">规格:{{x.specification||'--'}} 库位:{{x.location||'--'}}</view><view class="actions" @click.stop><button @click="go(x.id,'detail')">详情</button><button v-if="p('update')" @click="go(x.id)">编辑</button><button v-if="p('receive')" @click="action('receive',x)">入库</button><button v-if="p('issue')&&Number(x.stockQuantity)>0" @click="action('issue',x)">领用</button><button v-if="p('record')" @click="uni.navigateTo({url:'/pages/mes/dv/spare-record/index?sparePartId='+x.id})">记录</button><button v-if="p('delete')" class="danger" @click="remove(x)">删除</button></view></view><view v-if="!rows.length" class="state">{{loading?'加载中...':'暂无备件'}}</view></scroll-view><view v-else class="state">暂无备件查看权限</view></template><view v-else class="state">登录后查看备件</view><button v-if="canCreate" class="fab" @click="go()"><view/></button></view></template><style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}
.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.search text{flex:none;color:#1769d8;font-size:24rpx}
.list{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}
.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head b{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.head>view:first-child text{color:#78879b;font-size:23rpx}
.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;line-height:36rpx;border-radius:999rpx;white-space:nowrap}.tag-ok{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-stop{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}
.stock{display:grid;grid-template-columns:repeat(3,1fr);gap:12rpx;margin-top:16rpx;padding:16rpx 0;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.stock span{display:flex;align-items:center;flex-direction:column;gap:6rpx;color:#8795a8;font-size:21rpx}.stock b{color:#20334c;font-size:29rpx}.stock .low{color:#d45b50}.meta{padding-top:14rpx;color:#66778c;font-size:23rpx}
.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}
.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/dv/subject/index.vue
@@ -74,5 +74,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;font-size:22rpx!important;border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.status.enabled{color:#1769d8;background:#edf5ff}.status.disabled{color:#8d9bad;background:#f0f3f6}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:16rpx}.tags text{max-width:100%;padding:6rpx 14rpx;overflow:hidden;color:#1769d8;font-size:22rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap;background:#eef5ff;border:1rpx solid #bfdbff;border-radius:999rpx}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:14rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;font-size:22rpx!important;border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.status.enabled{color:#1769d8;background:#edf5ff}.status.disabled{color:#8d9bad;background:#f0f3f6}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:16rpx}.tags text{max-width:100%;padding:6rpx 14rpx;overflow:hidden;color:#1769d8;font-size:22rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap;background:#eef5ff;border:1rpx solid #bfdbff;border-radius:999rpx}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:14rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/pd/archive/index.vue
@@ -18,7 +18,6 @@
  const loadError = ref("");
  /** ä¸Ž web ç«¯ archive/index.vue ä¸€è‡´ï¼šä»… export æƒé™ï¼Œåˆ—表无行操作 */
  const canExport = computed(() => hasPermission("mes:pd-archive:export"));
  const hasMore = computed(() => rows.value.length < total.value);
  function statusText(status?: number) {
@@ -108,7 +107,6 @@
        </view>
        <view v-else class="state">{{ loading ? '加载中...' : '暂无归档台账' }}</view>
      </scroll-view>
      <view v-if="canExport" class="export-tip">导出请在 Web ç«¯ä½¿ç”¨</view>
    </template>
    <view v-else class="state">登录后查看归档台账</view>
  </view>
@@ -131,5 +129,4 @@
  .more{display:block;padding:16rpx 0 6rpx;color:#93a1b3;font-size:22rpx;text-align:center}
  .state{padding:60rpx 20rpx;color:#8795a8;font-size:25rpx;text-align:center}
  .state.error{color:#c65050}
  .export-tip{padding:12rpx 0 24rpx;color:#9aa8ba;font-size:22rpx;text-align:center}
</style>
src/pages/mes/pro/card/form.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
<script setup lang="ts">
import{computed,reactive,ref}from"vue";import{onLoad}from"@dcloudio/uni-app";import{createCard,createCardProcess,deleteCardProcess,getCard,getCardProcessPage,updateCard,updateCardProcess,type TransferCard,type TransferProcess}from"../../../../api/mes-operations";import{getWorkOrderPage,type WorkOrder}from"../../../../api/production";import{generateAutoCode,getMesItemPage,getProcessSimpleList,getWorkstationPage,type MesMdItem,type MesWorkstation,type ProProcess}from"../../../../api/process-design";import{getHrmUserList,type UserOption}from"../../../../api/hrm";import{useAuth}from"../../../../stores/auth";const{hasPermission,state}=useAuth(),id=ref<number>(),mode=ref("edit"),orders=ref<WorkOrder[]>([]),items=ref<MesMdItem[]>([]),processes=ref<ProProcess[]>([]),stations=ref<MesWorkstation[]>([]),users=ref<UserOption[]>([]),lines=ref<TransferProcess[]>([]),open=ref(false),editing=ref<TransferProcess>(),form=reactive<TransferCard>({code:"",status:0,transferedQuantity:0}),line=reactive<TransferProcess>({sort:1,inputQuantity:0,outputQuantity:0,unqualifiedQuantity:0});const readonly=computed(()=>mode.value==="detail"||form.status!==0),canSave=computed(()=>id.value?hasPermission("mes:pro-card:update"):hasPermission("mes:pro-card:create"));function selectOrder(i:number){const x=orders.value[i];Object.assign(form,{workOrderId:x.id,workOrderCode:x.code,workOrderName:x.name,itemId:x.productId,itemCode:x.productCode,itemName:x.productName,specification:x.productSpecification,unitMeasureName:x.unitMeasureName})}function selectItem(i:number){const x=items.value[i];Object.assign(form,{itemId:x.id,itemCode:x.code,itemName:x.name,specification:x.specification,unitMeasureName:x.unitMeasureName})}async function save(){if(!state.accessToken||!canSave.value||!form.code||!form.workOrderId||!form.itemId)return uni.showToast({title:"请完整填写必填项",icon:"none"});id.value?await updateCard(state.accessToken,{...form,id:id.value}):id.value=await createCard(state.accessToken,form);uni.showToast({title:"保存成功",icon:"success"});loadLines()}async function loadLines(){if(state.accessToken&&id.value)lines.value=(await getCardProcessPage(state.accessToken,{pageNo:1,pageSize:100,cardId:id.value})).list}function editLine(x?:TransferProcess){editing.value=x;Object.assign(line,x||{id:undefined,sort:lines.value.length+1,processId:undefined,workstationId:undefined,userId:undefined,inputTime:"",outputTime:"",inputQuantity:0,outputQuantity:0,unqualifiedQuantity:0,remark:""});open.value=true}async function saveLine(){if(!state.accessToken||!id.value||!line.processId)return uni.showToast({title:"请选择工序",icon:"none"});const d={...line,cardId:id.value};editing.value?.id?await updateCardProcess(state.accessToken,{...d,id:editing.value.id}):await createCardProcess(state.accessToken,d);open.value=false;loadLines()}async function removeLine(x:TransferProcess){if(state.accessToken&&x.id){await deleteCardProcess(state.accessToken,x.id);loadLines()}}onLoad(async q=>{id.value=q.id?Number(q.id):undefined;mode.value=q.mode||"edit";if(!state.accessToken)return;const[o,m,p,w,u]=await Promise.all([getWorkOrderPage(state.accessToken,{pageNo:1,pageSize:100}),getMesItemPage(state.accessToken,{pageNo:1,pageSize:100,status:0}),getProcessSimpleList(state.accessToken),getWorkstationPage(state.accessToken,{pageNo:1,pageSize:100,status:0}),getHrmUserList(state.accessToken)]);orders.value=o.list;items.value=m.list;processes.value=p;stations.value=w.list;users.value=u;if(id.value){Object.assign(form,await getCard(state.accessToken,id.value));loadLines()}else form.code=await generateAutoCode(state.accessToken,"PRO_CARD_CODE")});
</script><template><view class="page"><view class="card"><view class="field"><text>流转卡编号 *</text><input v-model="form.code" :disabled="readonly||!!id"/></view><view class="field"><text>生产订单 *</text><picker v-if="!readonly" :range="orders" range-key="code" @change="selectOrder($event.detail.value)"><view class="value">{{form.workOrderCode||'请选择'}} â€º</view></picker><text v-else class="value">{{form.workOrderCode}}</text></view><view class="field"><text>产品 *</text><picker v-if="!readonly" :range="items" range-key="name" @change="selectItem($event.detail.value)"><view class="value">{{form.itemName||'请选择'}} â€º</view></picker><text v-else class="value">{{form.itemName}}</text></view><view class="field"><text>批次号</text><input v-model="form.batchCode" :disabled="readonly"/></view><view class="field"><text>流转数量 *</text><input v-model.number="form.transferedQuantity" :disabled="readonly" type="digit"/></view><view class="field col"><text>备注</text><textarea v-model="form.remark" :disabled="readonly"/></view></view><button v-if="!readonly&&canSave" class="save" @click="save">保存</button><view v-if="id" class="section"><view class="section-head"><b>工序明细</b><button v-if="!readonly" @click="editLine()">添加工序</button></view><view v-for="x in lines" :key="x.id" class="line"><b>{{x.sort}}. {{x.processName||x.processCode}}</b><text>工位:{{x.workstationName||'--'}} 操作人:{{x.nickname||'--'}}</text><text>投入 {{x.inputQuantity??0}} / äº§å‡º {{x.outputQuantity??0}} / ä¸åˆæ ¼ {{x.unqualifiedQuantity??0}}</text><text>{{x.inputTime||'--'}} è‡³ {{x.outputTime||'--'}}</text><view v-if="!readonly"><button @click="editLine(x)">编辑</button><button @click="removeLine(x)">删除</button></view></view><view v-if="!lines.length" class="state">暂无工序明细</view></view><view v-if="open" class="mask" @click="open=false"><scroll-view class="sheet" scroll-y @click.stop><h3>{{editing?'编辑工序':'添加工序'}}</h3><view class="field"><text>顺序</text><input v-model.number="line.sort" type="number"/></view><view class="field"><text>工序 *</text><picker :range="processes" range-key="name" @change="line.processId=processes[$event.detail.value].id"><view class="value">{{processes.find(x=>x.id===line.processId)?.name||line.processName||'请选择'}} â€º</view></picker></view><view class="field"><text>工位</text><picker :range="stations" range-key="name" @change="line.workstationId=stations[$event.detail.value].id"><view class="value">{{stations.find(x=>x.id===line.workstationId)?.name||line.workstationName||'请选择'}} â€º</view></picker></view><view class="field"><text>操作人</text><picker :range="users" range-key="nickname" @change="line.userId=users[$event.detail.value].id"><view class="value">{{users.find(x=>x.id===line.userId)?.nickname||line.nickname||'请选择'}} â€º</view></picker></view><view class="field"><text>投入时间</text><input v-model="line.inputTime" placeholder="YYYY-MM-DD HH:mm:ss"/></view><view class="field"><text>产出时间</text><input v-model="line.outputTime" placeholder="YYYY-MM-DD HH:mm:ss"/></view><view class="field"><text>投入数量</text><input v-model.number="line.inputQuantity" type="digit"/></view><view class="field"><text>产出数量</text><input v-model.number="line.outputQuantity" type="digit"/></view><view class="field"><text>不合格数量</text><input v-model.number="line.unqualifiedQuantity" type="digit"/></view><view class="field col"><text>备注</text><textarea v-model="line.remark"/></view><button class="save inner" @click="saveLine">保存工序</button></scroll-view></view></view></template><style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx;background:#f6f7f9}.card,.section{overflow:hidden;background:#fff;border-radius:16rpx}.section{margin-top:24rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eee}.field>text:first-child{width:190rpx}.field input,.field picker,.value{flex:1;text-align:right}.col{align-items:flex-start;flex-direction:column;padding-block:20rpx}.col textarea{width:100%;height:120rpx}.save{margin-top:28rpx;color:#fff;background:#1769d8}.section-head{display:flex;justify-content:space-between;padding:22rpx}.section-head button,.line button{min-height:48rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:46rpx}.line{display:flex;flex-direction:column;gap:8rpx;padding:20rpx;border-top:1rpx solid #eee;color:#66778c;font-size:23rpx}.line>view{display:flex;justify-content:flex-end;gap:10rpx}.state{padding:30rpx;text-align:center}.mask{position:fixed;inset:0;display:flex;align-items:flex-end;background:#0006}.sheet{max-height:85vh;background:#fff}.sheet h3{padding:25rpx}.inner{margin:25rpx 30rpx 50rpx}</style>
src/pages/mes/pro/card/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
<script setup lang="ts">
import{computed,ref}from"vue";import{onShow,onPullDownRefresh}from"@dcloudio/uni-app";import{cancelCard,deleteCard,finishCard,getCardPage,submitCard,type TransferCard}from"../../../../api/mes-operations";import{useAuth}from"../../../../stores/auth";const{hasPermission,isLoggedIn,state}=useAuth(),keyword=ref(""),rows=ref<TransferCard[]>([]),loading=ref(false),p=(x:string)=>hasPermission("mes:pro-card:"+x),canQuery=computed(()=>p("query")),canCreate=computed(()=>p("create")),labels:Record<number,string>={0:"草稿",1:"已确认",2:"已完工",3:"已取消"};async function load(){if(!state.accessToken||!canQuery.value)return;loading.value=true;try{rows.value=(await getCardPage(state.accessToken,{pageNo:1,pageSize:100,code:keyword.value||undefined})).list}finally{loading.value=false;uni.stopPullDownRefresh()}}function go(id?:number,mode="edit"){uni.navigateTo({url:"/pages/mes/pro/card/form"+(id?"?id="+id+"&mode="+mode:"")})}async function run(x:TransferCard,t:string){if(!state.accessToken||!x.id)return;const ok=await new Promise<boolean>(r=>uni.showModal({title:"确认操作",content:"确定执行该操作吗?",success:v=>r(v.confirm)}));if(!ok)return;if(t==="delete")await deleteCard(state.accessToken,x.id);else if(t==="submit")await submitCard(state.accessToken,x.id);else if(t==="finish")await finishCard(state.accessToken,x.id);else await cancelCard(state.accessToken,x.id);load()}onShow(load);onPullDownRefresh(load);
</script><template><view class="page"><template v-if="isLoggedIn"><view v-if="canQuery" class="search"><input v-model="keyword" placeholder="搜索流转卡编号" @confirm="load"/><text @click="keyword='';load()">清除</text></view><scroll-view v-if="canQuery" class="list" scroll-y><view v-for="x in rows" :key="x.id" class="row" @click="go(x.id,'detail')"><view class="head"><view><b>{{x.code||'暂无编号'}}</b><text>{{x.workOrderCode||'暂无生产订单'}}</text></view><view class="status-wrap"><text :class="['status','s'+x.status]">{{labels[Number(x.status)]||'未知'}}</text></view></view><view class="grid"><text>产品:{{x.itemCode||'--'}} {{x.itemName||''}}</text><text>规格:{{x.specification||'--'}}</text><text>批次:{{x.batchCode||'--'}}</text><text>流转数量:{{x.transferedQuantity??0}} {{x.unitMeasureName||''}}</text></view><view class="actions" @click.stop><button @click="go(x.id,'detail')">详情</button><button v-if="p('update')&&x.status===0" @click="go(x.id)">编辑</button><button v-if="p('update')&&x.status===0" @click="run(x,'submit')">提交</button><button v-if="p('finish')&&x.status===1" @click="run(x,'finish')">完工</button><button v-if="p('update')&&x.status===1" @click="run(x,'cancel')">取消</button><button v-if="p('delete')&&x.status===0" @click="run(x,'delete')">删除</button></view></view><view v-if="!rows.length" class="state">{{loading?'加载中...':'暂无工序流转卡'}}</view></scroll-view><view v-else class="state">暂无工序流转查看权限</view></template><view v-else class="state">登录后查看工序流转</view><button v-if="canCreate" class="fab" @click="go()"><view/></button></view></template><style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}
.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.search text{flex:none;color:#1769d8;font-size:24rpx}
.list{height:0;flex:1;padding-bottom:100rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}
.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head b{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.head>view:first-child text{color:#78879b;font-size:23rpx}
.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;line-height:36rpx;border-radius:999rpx;white-space:nowrap}.s0{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.s1{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.s2{color:#7a52c6;background:#f3edff;border:1rpx solid #d4c0ff}.s3{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}
.grid{display:grid;gap:9rpx;padding:14rpx 0;margin-top:14rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions button::after,.fab::after{border:0}.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}
.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/pro/feedback/index.vue
@@ -133,5 +133,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 24rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 14rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.list{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tag-draft{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-wait{color:#b58100;background:#fff7e6;border:1rpx solid #ffd591}.tag-ok{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-stop{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;color:#1769d8;font-size:22rpx;background:#edf5ff;border:1rpx solid #bfdbff;border-radius:999rpx}.grid{display:grid;gap:9rpx;padding:14rpx 0;margin-top:14rpx;color:#66778c;font-size:22rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}
.page{height:100vh;display:flex;flex-direction:column;padding:0 24rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 14rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.list{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tag-draft{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-wait{color:#b58100;background:#fff7e6;border:1rpx solid #ffd591}.tag-ok{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-stop{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;color:#1769d8;font-size:22rpx;background:#edf5ff;border:1rpx solid #bfdbff;border-radius:999rpx}.grid{display:grid;gap:9rpx;padding:14rpx 0;margin-top:14rpx;color:#66778c;font-size:22rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/pro/mps/index.vue
@@ -147,5 +147,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 24rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 14rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text,.merge{color:#1769d8;font-size:24rpx}.merge{align-self:flex-end;padding:10rpx 18rpx;margin-bottom:14rpx;background:#eef5ff;border:1rpx solid #9bc1f5;border-radius:999rpx}.list{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;gap:14rpx}.select{width:42rpx;flex:none}.title{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.title text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tag-draft{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-ok{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-finish{color:#7a52c6;background:#f3edff;border:1rpx solid #d4c0ff}.tag-stop{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;color:#1769d8;font-size:22rpx;background:#edf5ff;border:1rpx solid #bfdbff;border-radius:999rpx}.grid{display:grid;gap:9rpx;padding:14rpx 0;margin-top:14rpx;color:#66778c;font-size:22rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}
.page{height:100vh;display:flex;flex-direction:column;padding:0 24rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 14rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text,.merge{color:#1769d8;font-size:24rpx}.merge{align-self:flex-end;padding:10rpx 18rpx;margin-bottom:14rpx;background:#eef5ff;border:1rpx solid #9bc1f5;border-radius:999rpx}.list{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;gap:14rpx}.select{width:42rpx;flex:none}.title{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.title text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tag-draft{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-ok{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-finish{color:#7a52c6;background:#f3edff;border:1rpx solid #d4c0ff}.tag-stop{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;color:#1769d8;font-size:22rpx;background:#edf5ff;border:1rpx solid #bfdbff;border-radius:999rpx}.grid{display:grid;gap:9rpx;padding:14rpx 0;margin-top:14rpx;color:#66778c;font-size:22rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/pro/task/index.vue
@@ -2,7 +2,7 @@
import { computed, ref } from "vue";
import { onPullDownRefresh, onShow } from "@dcloudio/uni-app";
import { getSimpleDictDataList, type DictData } from "../../../../api/crm";
import { getWorkOrderSchedulePage, type WorkOrder } from "../../../../api/production";
import { executeBatchSchedule, getWorkOrderSchedulePage, previewBatchSchedule, type WorkOrder } from "../../../../api/production";
import { useAuth } from "../../../../stores/auth";
import { dateText, dayText, dictLabel } from "../../dv/shared";
import { statusToneClass } from "../../../../utils/status";
@@ -82,6 +82,38 @@
function goSchedule(row: WorkOrder, mode: "schedule" | "detail" = "detail") {
  uni.navigateTo({ url: `/pages/mes/pro/task/form?workOrderId=${row.id}&mode=${mode}` });
}
function scheduleStartTime() {
  const date = new Date(Date.now() + 5 * 60 * 1000);
  if (date.getHours() >= 18) { date.setDate(date.getDate() + 1); date.setHours(9, 0, 0, 0); }
  else if (date.getHours() < 9) date.setHours(9, 0, 0, 0);
  while (date.getDay() === 0 || date.getDay() === 6) date.setDate(date.getDate() + 1);
  const pad = (value: number) => String(value).padStart(2, "0");
  return date.getFullYear() + "-" + pad(date.getMonth()+1) + "-" + pad(date.getDate()) + " " + pad(date.getHours()) + ":" + pad(date.getMinutes()) + ":00";
}
async function autoSchedule(row: WorkOrder) {
  if (!state.accessToken || !row.id) return;
  if (row.status !== 1 || row.type !== 1 || isCompleted(row) || Number(row.quantityScheduled || 0) >= Number(row.quantity || 0)) {
    return uni.showToast({ title: "仅可排产已确认且仍有待排数量的自行生产工单", icon: "none" });
  }
  const startTime = scheduleStartTime();
  try {
    uni.showLoading({ title: "生成排产预览" });
    const preview = await previewBatchSchedule(state.accessToken, { workOrderIds: [row.id], startTime });
    uni.hideLoading();
    const error = preview.orders.find(item => item.error)?.error;
    if (!preview.canExecute || error) return uni.showModal({ title: "无法排产", content: error || "工单未通过排产校验", showCancel: false });
    const warning = preview.warnings.join("\n");
    const content = "预计生成 " + preview.tasks.length + " ä¸ªä»»åŠ¡ï¼Œæœ€æ—©å¼€å·¥ " + startTime + (warning ? "\n\n交期提示:" + warning : "");
    const confirmed = await new Promise<boolean>(resolve => uni.showModal({ title: "一键排产预览", content, confirmText: warning ? "接受并排产" : "确认排产", success: res => resolve(res.confirm) }));
    if (!confirmed) return;
    const result = await executeBatchSchedule(state.accessToken, { workOrderIds: [row.id], startTime, previewHash: preview.previewHash, previewTime: preview.previewTime, allowLate: !!warning });
    uni.showToast({ title: "已生成" + result.taskIds.length + "个任务", icon: "success" });
    load(true);
  } catch (error) {
    uni.hideLoading();
    uni.showToast({ title: error instanceof Error ? error.message : "一键排产失败", icon: "none" });
  }
}
function goArchive(row: WorkOrder) {
  if (!row.productCode) return uni.showToast({ title: "暂无产品编码", icon: "none" });
  uni.navigateTo({ url: `/pages/mes/pd/archive/detail?productCode=${encodeURIComponent(row.productCode)}` });
@@ -119,7 +151,7 @@
            <view class="progress"><view><view :style="{width:progress(row)+'%'}" /></view><text>{{ progress(row) }}%</text></view>
            <view class="actions" @click.stop>
              <button @click="goSchedule(row,'detail')">详情</button>
              <button v-if="canSchedule && row.status === 1 && row.productionStatus !== 2" @click="goSchedule(row,'schedule')">排产维护</button>
              <button v-if="canSchedule && row.status === 1 && row.productionStatus !== 2" @click="goSchedule(row,'schedule')">排产维护</button><button v-if="canSchedule && row.status === 1 && row.type === 1 && row.productionStatus !== 2 && Number(row.quantityScheduled||0) < Number(row.quantity||0)" @click="autoSchedule(row)">一键排产</button>
              <button @click="goArchive(row)">归档详情</button>
            </view>
          </view>
src/pages/mes/pro/workorder/index.vue
@@ -144,5 +144,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 24rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 14rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.list{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.title{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.title text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tag-draft{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-ok{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-finish{color:#7a52c6;background:#f3edff;border:1rpx solid #d4c0ff}.tag-stop{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;color:#1769d8;font-size:22rpx;background:#edf5ff;border:1rpx solid #bfdbff;border-radius:999rpx}.grid{display:grid;gap:9rpx;padding:14rpx 0;margin-top:14rpx;color:#66778c;font-size:22rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.progress{display:flex;align-items:center;gap:12rpx;margin-top:14rpx;color:#66778c;font-size:22rpx}.progress>view{height:12rpx;flex:1;overflow:hidden;background:#eef3f8;border-radius:999rpx}.progress>view>view{height:100%;background:#1769d8;border-radius:999rpx}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}
.page{height:100vh;display:flex;flex-direction:column;padding:0 24rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 14rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.list{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.title{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.title text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tag-draft{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-ok{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-finish{color:#7a52c6;background:#f3edff;border:1rpx solid #d4c0ff}.tag-stop{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;color:#1769d8;font-size:22rpx;background:#edf5ff;border:1rpx solid #bfdbff;border-radius:999rpx}.grid{display:grid;gap:9rpx;padding:14rpx 0;margin-top:14rpx;color:#66778c;font-size:22rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.progress{display:flex;align-items:center;gap:12rpx;margin-top:14rpx;color:#66778c;font-size:22rpx}.progress>view{height:12rpx;flex:1;overflow:hidden;background:#eef3f8;border-radius:999rpx}.progress>view>view{height:100%;background:#1769d8;border-radius:999rpx}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/qc/defect/index.vue
@@ -65,5 +65,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;font-size:22rpx;border-radius:999rpx}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.enabled{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.warning{color:#b06a00;background:#fff6df;border:1rpx solid #f0d390}.danger{color:#c65050;background:#fff2f2;border:1rpx solid #efb8b8}.info,.tag-info{color:#1769d8;background:#eef6ff;border:1rpx solid #c9e1ff}.tag-approved{color:#1769d8;background:#eef6ff}.tag-progress{color:#8a5a00;background:#fff6df}.tag-success{color:#0e9663;background:#e9fbf2}.tag-finish{color:#6b55c8;background:#f1efff}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;font-size:22rpx;border-radius:999rpx}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.enabled{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.warning{color:#b06a00;background:#fff6df;border:1rpx solid #f0d390}.danger{color:#c65050;background:#fff2f2;border:1rpx solid #efb8b8}.info,.tag-info{color:#1769d8;background:#eef6ff;border:1rpx solid #c9e1ff}.tag-approved{color:#1769d8;background:#eef6ff}.tag-progress{color:#8a5a00;background:#fff6df}.tag-success{color:#0e9663;background:#e9fbf2}.tag-finish{color:#6b55c8;background:#f1efff}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/qc/indicator/index.vue
@@ -84,5 +84,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;font-size:22rpx;border-radius:999rpx}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;font-size:22rpx;border-radius:999rpx}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/qc/ncr/index.vue
@@ -115,5 +115,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;font-size:22rpx;border-radius:999rpx}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.grid .full{grid-column:1/3}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button,.modal-actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after,.modal-actions button::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.enabled{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.warning{color:#b06a00;background:#fff6df;border:1rpx solid #f0d390}.danger{color:#c65050;background:#fff2f2;border:1rpx solid #efb8b8}.info,.tag-info{color:#1769d8;background:#eef6ff;border:1rpx solid #c9e1ff}.tag-approved{color:#1769d8;background:#eef6ff}.tag-progress{color:#6b55c8;background:#f1efff}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}.mask{position:fixed;inset:0;z-index:20;display:flex;align-items:flex-end;background:rgba(20,31,48,.42)}.modal{width:100%;max-height:78vh;padding:24rpx 30rpx 34rpx;overflow:auto;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{padding:8rpx 0 22rpx;color:#20334c;font-size:31rpx;font-weight:700}.field{display:flex;align-items:center;min-height:92rpx;gap:20rpx;padding:0 6rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:26rpx}.picker{display:flex;min-width:0;flex:1;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a;font-size:26rpx}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.column{align-items:flex-start;flex-direction:column;padding:18rpx 6rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;box-sizing:border-box;font-size:26rpx}.required{color:#e23b3b}.modal-actions{display:flex;justify-content:flex-end;gap:16rpx;padding-top:24rpx}.modal-actions .primary{color:#fff;background:#1769d8}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;font-size:22rpx;border-radius:999rpx}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.grid .full{grid-column:1/3}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button,.modal-actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after,.modal-actions button::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.enabled{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.warning{color:#b06a00;background:#fff6df;border:1rpx solid #f0d390}.danger{color:#c65050;background:#fff2f2;border:1rpx solid #efb8b8}.info,.tag-info{color:#1769d8;background:#eef6ff;border:1rpx solid #c9e1ff}.tag-approved{color:#1769d8;background:#eef6ff}.tag-progress{color:#6b55c8;background:#f1efff}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}.mask{position:fixed;inset:0;z-index:20;display:flex;align-items:flex-end;background:rgba(20,31,48,.42)}.modal{width:100%;max-height:78vh;padding:24rpx 30rpx 34rpx;overflow:auto;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{padding:8rpx 0 22rpx;color:#20334c;font-size:31rpx;font-weight:700}.field{display:flex;align-items:center;min-height:92rpx;gap:20rpx;padding:0 6rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:26rpx}.picker{display:flex;min-width:0;flex:1;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a;font-size:26rpx}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.column{align-items:flex-start;flex-direction:column;padding:18rpx 6rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;box-sizing:border-box;font-size:26rpx}.required{color:#e23b3b}.modal-actions{display:flex;justify-content:flex-end;gap:16rpx;padding-top:24rpx}.modal-actions .primary{color:#fff;background:#1769d8}
</style>
src/pages/mes/qc/report/template/index.vue
@@ -64,5 +64,5 @@
</template><view v-else class="state">登录后查看报告模板</view><button v-if="canCreate" class="fab" @click="go()"><view /></button></view></template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;font-size:22rpx;border-radius:999rpx;color:#1769d8;background:#eef6ff}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.grid .full{grid-column:1/3}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.enabled,.tag-success{color:#0e9663!important;background:#e9fbf2!important;border:1rpx solid #b8eed4}.warning{color:#b06a00;background:#fff6df;border:1rpx solid #f0d390}.danger{color:#c65050;background:#fff2f2;border:1rpx solid #efb8b8}.info,.tag-info{color:#1769d8!important;background:#eef6ff!important;border:1rpx solid #c9e1ff}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;font-size:22rpx;border-radius:999rpx;color:#1769d8;background:#eef6ff}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.grid .full{grid-column:1/3}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.enabled,.tag-success{color:#0e9663!important;background:#e9fbf2!important;border:1rpx solid #b8eed4}.warning{color:#b06a00;background:#fff6df;border:1rpx solid #f0d390}.danger{color:#c65050;background:#fff2f2;border:1rpx solid #efb8b8}.info,.tag-info{color:#1769d8!important;background:#eef6ff!important;border:1rpx solid #c9e1ff}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/qc/template/index.vue
@@ -70,5 +70,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;font-size:22rpx;border-radius:999rpx}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;font-size:22rpx;border-radius:999rpx}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/tm/tool/index.vue
@@ -112,5 +112,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 24rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 14rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.main-layout{height:0;min-height:0;flex:1;display:flex;gap:16rpx;padding-bottom:150rpx;box-sizing:border-box}.type-nav{width:188rpx;height:100%;flex:none;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.05)}.type-item{position:relative;display:flex;align-items:center;min-height:78rpx;padding:14rpx 12rpx 14rpx 18rpx;box-sizing:border-box;color:#617287;font-size:23rpx;border-bottom:1rpx solid #edf1f6}.type-item text{display:-webkit-box;min-width:0;overflow:hidden;line-height:1.25;text-overflow:ellipsis;-webkit-line-clamp:2;-webkit-box-orient:vertical}.type-item.active{color:#1769d8;font-weight:600;background:#eef5ff}.type-item.active::before{position:absolute;top:18rpx;bottom:18rpx;left:0;width:6rpx;background:#1769d8;border-radius:0 6rpx 6rpx 0;content:""}.content{height:100%;min-width:0;flex:1;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tag-store{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-issue{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-repair{color:#b57800;background:#fff7dd;border:1rpx solid #f3dc98}.tag-scrap{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.tags{display:flex;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;color:#1769d8;font-size:22rpx;background:#edf5ff;border:1rpx solid #bfdbff;border-radius:999rpx}.grid{display:grid;gap:9rpx;padding:14rpx 0;margin-top:14rpx;color:#66778c;font-size:22rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}
.page{height:100vh;display:flex;flex-direction:column;padding:0 24rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 14rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.main-layout{height:0;min-height:0;flex:1;display:flex;gap:16rpx;padding-bottom:150rpx;box-sizing:border-box}.type-nav{width:188rpx;height:100%;flex:none;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.05)}.type-item{position:relative;display:flex;align-items:center;min-height:78rpx;padding:14rpx 12rpx 14rpx 18rpx;box-sizing:border-box;color:#617287;font-size:23rpx;border-bottom:1rpx solid #edf1f6}.type-item text{display:-webkit-box;min-width:0;overflow:hidden;line-height:1.25;text-overflow:ellipsis;-webkit-line-clamp:2;-webkit-box-orient:vertical}.type-item.active{color:#1769d8;font-weight:600;background:#eef5ff}.type-item.active::before{position:absolute;top:18rpx;bottom:18rpx;left:0;width:6rpx;background:#1769d8;border-radius:0 6rpx 6rpx 0;content:""}.content{height:100%;min-width:0;flex:1;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tag-store{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-issue{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-repair{color:#b57800;background:#fff7dd;border:1rpx solid #f3dc98}.tag-scrap{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.tags{display:flex;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;color:#1769d8;font-size:22rpx;background:#edf5ff;border:1rpx solid #bfdbff;border-radius:999rpx}.grid{display:grid;gap:9rpx;padding:14rpx 0;margin-top:14rpx;color:#66778c;font-size:22rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/tm/tool/type/index.vue
@@ -92,5 +92,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.enabled{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.disabled{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.enabled{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.disabled{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/wls/barcode/config.vue
@@ -108,5 +108,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.enabled{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.disabled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.danger{color:#c65050!important;background:#fff7f7!important;border-color:#e3a0a0!important}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:60;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:28rpx;box-sizing:border-box;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#10233f;font-size:30rpx;font-weight:600;text-align:center}.field{display:flex;align-items:center;min-height:86rpx;padding:0 22rpx;border-bottom:1rpx solid #edf1f6;box-sizing:border-box}.field>text:first-child{flex:none;width:190rpx;color:#10233f;font-size:26rpx}.field>picker{display:block;flex:1;min-width:0}.field input,.field textarea,.value,.picker{flex:1;min-width:0;color:#10233f;font-size:26rpx;text-align:right}.field textarea{height:120rpx;padding:22rpx 0}.field.column{align-items:flex-start;flex-direction:column;padding:22rpx}.field.column>text:first-child{width:auto;margin-bottom:12rpx}.field.column textarea{text-align:left;width:100%;height:120rpx;padding:0}.required{color:#e23b3b}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:10rpx}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;text-align:right}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;height:72rpx;line-height:72rpx;font-size:27rpx;border-radius:10rpx}.modal-actions .primary{color:#fff;background:#1769d8}.actions button::after,.fab::after,.modal-actions button::after{border:0}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.enabled{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.disabled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.danger{color:#c65050!important;background:#fff7f7!important;border-color:#e3a0a0!important}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:60;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:28rpx;box-sizing:border-box;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#10233f;font-size:30rpx;font-weight:600;text-align:center}.field{display:flex;align-items:center;min-height:86rpx;padding:0 22rpx;border-bottom:1rpx solid #edf1f6;box-sizing:border-box}.field>text:first-child{flex:none;width:190rpx;color:#10233f;font-size:26rpx}.field>picker{display:block;flex:1;min-width:0}.field input,.field textarea,.value,.picker{flex:1;min-width:0;color:#10233f;font-size:26rpx;text-align:right}.field textarea{height:120rpx;padding:22rpx 0}.field.column{align-items:flex-start;flex-direction:column;padding:22rpx}.field.column>text:first-child{width:auto;margin-bottom:12rpx}.field.column textarea{text-align:left;width:100%;height:120rpx;padding:0}.required{color:#e23b3b}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:10rpx}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;text-align:right}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;height:72rpx;line-height:72rpx;font-size:27rpx;border-radius:10rpx}.modal-actions .primary{color:#fff;background:#1769d8}.actions button::after,.fab::after,.modal-actions button::after{border:0}
</style>
src/pages/wls/barcode/index.vue
@@ -252,5 +252,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.enabled{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.disabled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:12rpx;padding-top:16rpx}.actions button,.close{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.danger{color:#c65050!important;background:#fff7f7!important;border-color:#e3a0a0!important}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.config-fab{position:fixed;right:42rpx;bottom:calc(194rpx + env(safe-area-inset-bottom));display:flex;flex-direction:column;align-items:center;justify-content:center;width:112rpx;height:112rpx;min-height:112rpx;padding:0;margin:0;color:#1769d8;font-size:22rpx;line-height:1.25;background:#fff;border:1rpx solid #8ab3ee;border-radius:50%;box-shadow:0 10rpx 24rpx rgba(43,69,107,.16)}.config-fab text{display:block;color:#1769d8;font-size:22rpx;line-height:1.25;text-align:center}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:60;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:28rpx;box-sizing:border-box;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#10233f;font-size:30rpx;font-weight:600;text-align:center}.field{display:flex;align-items:center;min-height:86rpx;padding:0 22rpx;border-bottom:1rpx solid #edf1f6;box-sizing:border-box}.field>text:first-child{flex:none;width:190rpx;color:#10233f;font-size:26rpx}.field>picker{display:block;flex:1;min-width:0}.field input,.field textarea,.value,.picker{flex:1;min-width:0;color:#10233f;font-size:26rpx;text-align:right}.field textarea{height:120rpx;padding:22rpx 0}.field.column{align-items:flex-start;flex-direction:column;padding:22rpx}.field.column>text:first-child{width:auto;margin-bottom:12rpx}.field.column textarea{text-align:left;width:100%;height:120rpx;padding:0}.required{color:#e23b3b}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:10rpx}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;text-align:right}.code-field input{text-align:left}.code-field button{height:52rpx;min-height:52rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:23rpx;line-height:50rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;height:72rpx;line-height:72rpx;font-size:27rpx;border-radius:10rpx}.modal-actions .primary{color:#fff;background:#1769d8}.actions button::after,.fab::after,.config-fab::after,.modal-actions button::after,.close::after,.code-field button::after{border:0}.close{width:calc(100% - 48rpx);height:72rpx;margin:24rpx}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.enabled{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.disabled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:12rpx;padding-top:16rpx}.actions button,.close{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.danger{color:#c65050!important;background:#fff7f7!important;border-color:#e3a0a0!important}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.config-fab{position:fixed;right:42rpx;bottom:calc(194rpx + env(safe-area-inset-bottom));display:flex;flex-direction:column;align-items:center;justify-content:center;width:112rpx;height:112rpx;min-height:112rpx;padding:0;margin:0;color:#1769d8;font-size:22rpx;line-height:1.25;background:#fff;border:1rpx solid #8ab3ee;border-radius:50%;box-shadow:0 10rpx 24rpx rgba(43,69,107,.16)}.config-fab text{display:block;color:#1769d8;font-size:22rpx;line-height:1.25;text-align:center}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:60;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:28rpx;box-sizing:border-box;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#10233f;font-size:30rpx;font-weight:600;text-align:center}.field{display:flex;align-items:center;min-height:86rpx;padding:0 22rpx;border-bottom:1rpx solid #edf1f6;box-sizing:border-box}.field>text:first-child{flex:none;width:190rpx;color:#10233f;font-size:26rpx}.field>picker{display:block;flex:1;min-width:0}.field input,.field textarea,.value,.picker{flex:1;min-width:0;color:#10233f;font-size:26rpx;text-align:right}.field textarea{height:120rpx;padding:22rpx 0}.field.column{align-items:flex-start;flex-direction:column;padding:22rpx}.field.column>text:first-child{width:auto;margin-bottom:12rpx}.field.column textarea{text-align:left;width:100%;height:120rpx;padding:0}.required{color:#e23b3b}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:10rpx}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;text-align:right}.code-field input{text-align:left}.code-field button{height:52rpx;min-height:52rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:23rpx;line-height:50rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;height:72rpx;line-height:72rpx;font-size:27rpx;border-radius:10rpx}.modal-actions .primary{color:#fff;background:#1769d8}.actions button::after,.fab::after,.config-fab::after,.modal-actions button::after,.close::after,.code-field button::after{border:0}.close{width:calc(100% - 48rpx);height:72rpx;margin:24rpx}
</style>
src/pages/wls/components/WlsComplexList.vue
@@ -152,5 +152,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-draft{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-progress{color:#b57800;background:#fff7dd;border:1rpx solid #f3dc98}.tag-approved{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-finished{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-cancelled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-draft{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-progress{color:#b57800;background:#fff7dd;border:1rpx solid #f3dc98}.tag-approved{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-finished{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-cancelled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/wls/components/WlsDocList.vue
@@ -216,5 +216,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.toolbar{display:flex;justify-content:flex-end;padding-bottom:16rpx}.toolbar button{height:62rpx;padding:0 22rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:62rpx;background:#fff;border:1rpx solid #8ab3ee;border-radius:12rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-draft{color:#6f7e92;background:#f3f6fa;border:1rpx solid #dce4ee}.tag-progress{color:#b57800;background:#fff7dd;border:1rpx solid #f3dc98}.tag-approved{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-finished{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-cancelled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after,.modal-close::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:82vh;padding-bottom:24rpx;background:#f3f6fb;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#1d2f46;font-size:30rpx;font-weight:600;text-align:center;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-list{max-height:60vh;padding:20rpx 24rpx;box-sizing:border-box}.select-row{display:grid;gap:9rpx;padding:22rpx;margin-bottom:16rpx;color:#66778c;font-size:23rpx;background:#fff;border-radius:14rpx}.select-title{color:#20334c;font-size:29rpx;font-weight:600}.modal-close{margin:0 24rpx;color:#1769d8;background:#fff;border-radius:12rpx}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.toolbar{display:flex;justify-content:flex-end;padding-bottom:16rpx}.toolbar button{height:62rpx;padding:0 22rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:62rpx;background:#fff;border:1rpx solid #8ab3ee;border-radius:12rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-draft{color:#6f7e92;background:#f3f6fa;border:1rpx solid #dce4ee}.tag-progress{color:#b57800;background:#fff7dd;border:1rpx solid #f3dc98}.tag-approved{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-finished{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-cancelled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after,.modal-close::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:82vh;padding-bottom:24rpx;background:#f3f6fb;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#1d2f46;font-size:30rpx;font-weight:600;text-align:center;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-list{max-height:60vh;padding:20rpx 24rpx;box-sizing:border-box}.select-row{display:grid;gap:9rpx;padding:22rpx;margin-bottom:16rpx;color:#66778c;font-size:23rpx;background:#fff;border-radius:14rpx}.select-title{color:#20334c;font-size:29rpx;font-weight:600}.modal-close{margin:0 24rpx;color:#1769d8;background:#fff;border-radius:12rpx}
</style>
src/pages/wls/components/WlsExtraDocList.vue
@@ -162,5 +162,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;justify-content:center;flex:none;height:44rpx}.status{display:inline-flex;align-items:center;justify-content:center;height:44rpx;padding:0 18rpx;font-size:23rpx;line-height:44rpx;border-radius:999rpx;white-space:nowrap}.tag-draft{color:#6f7e92;background:#f3f6fa;border:1rpx solid #dce4ee}.tag-progress{color:#b57800;background:#fff7dd;border:1rpx solid #f3dc98}.tag-approved{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-finished{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-cancelled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;justify-content:center;flex:none;height:44rpx}.status{display:inline-flex;align-items:center;justify-content:center;height:44rpx;padding:0 18rpx;font-size:23rpx;line-height:44rpx;border-radius:999rpx;white-space:nowrap}.tag-draft{color:#6f7e92;background:#f3f6fa;border:1rpx solid #dce4ee}.tag-progress{color:#b57800;background:#fff7dd;border:1rpx solid #f3dc98}.tag-approved{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-finished{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-cancelled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/wls/components/WlsFlowDocList.vue
@@ -222,5 +222,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;justify-content:center;flex:none;min-height:44rpx}.status{display:inline-flex;align-items:center;justify-content:center;height:44rpx;padding:0 18rpx;font-size:23rpx;line-height:44rpx;border-radius:999rpx;white-space:nowrap}.tag-draft{color:#6f7e92;background:#f3f6fa;border:1rpx solid #dce4ee}.tag-progress{color:#b57800;background:#fff7dd;border:1rpx solid #f3dc98}.tag-approved{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-finished{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-cancelled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;justify-content:center;flex:none;min-height:44rpx}.status{display:inline-flex;align-items:center;justify-content:center;height:44rpx;padding:0 18rpx;font-size:23rpx;line-height:44rpx;border-radius:999rpx;white-space:nowrap}.tag-draft{color:#6f7e92;background:#f3f6fa;border:1rpx solid #dce4ee}.tag-progress{color:#b57800;background:#fff7dd;border:1rpx solid #f3dc98}.tag-approved{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-finished{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-cancelled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/wls/sn/index.vue
@@ -86,5 +86,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-approved{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:24rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#1d2f46;font-size:30rpx;font-weight:600;text-align:center;border-bottom:1rpx solid #eef1f5}.field{display:flex;align-items:center;min-height:92rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:26rpx}.field>picker{display:block;flex:1;min-width:0}.required{color:#e64340}.field input,.picker{min-width:0;flex:1;color:#1e3049;font-size:26rpx;text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:34rpx;text-align:right}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;margin:0;color:#1769d8;background:#edf5ff;border-radius:12rpx}.modal-actions .primary{color:#fff;background:#1769d8}.modal-list{max-height:60vh;padding:20rpx 24rpx;box-sizing:border-box;background:#f3f6fb}.select-row{display:grid;gap:9rpx;padding:22rpx;margin-bottom:16rpx;color:#66778c;font-size:23rpx;background:#fff;border-radius:14rpx}.select-title{color:#20334c;font-size:29rpx;font-weight:600}button::after{border:0}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-approved{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:24rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#1d2f46;font-size:30rpx;font-weight:600;text-align:center;border-bottom:1rpx solid #eef1f5}.field{display:flex;align-items:center;min-height:92rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:26rpx}.field>picker{display:block;flex:1;min-width:0}.required{color:#e64340}.field input,.picker{min-width:0;flex:1;color:#1e3049;font-size:26rpx;text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:34rpx;text-align:right}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;margin:0;color:#1769d8;background:#edf5ff;border-radius:12rpx}.modal-actions .primary{color:#fff;background:#1769d8}.modal-list{max-height:60vh;padding:20rpx 24rpx;box-sizing:border-box;background:#f3f6fb}.select-row{display:grid;gap:9rpx;padding:22rpx;margin-bottom:16rpx;color:#66778c;font-size:23rpx;background:#fff;border-radius:14rpx}.select-title{color:#20334c;font-size:29rpx;font-weight:600}button::after{border:0}
</style>
src/pages/wls/warehouse/area.vue
@@ -138,5 +138,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.tip{margin:18rpx 0 0;color:#53677f;font-size:24rpx}.search{display:flex;align-items:center;height:80rpx;margin:16rpx 0;padding:0 20rpx;background:#fff;border-radius:16rpx}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:120rpx}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-success,.tag-draft{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-danger,.tag-cancelled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-progress{color:#b57800;background:#fff7dd;border:1rpx solid #f3dc98}.tag-approved{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-finished{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:24rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#1d2f46;font-size:30rpx;font-weight:600;text-align:center;border-bottom:1rpx solid #eef1f5}.field{display:flex;align-items:center;min-height:92rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:26rpx}.required{color:#e64340}.field>picker{display:block;flex:1;min-width:0}.field input,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:26rpx;text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:34rpx;text-align:right}.code-field input{flex:1}.code-field button{flex:none;min-width:132rpx;padding:0 14rpx;margin:0;color:#1769d8;font-size:23rpx;line-height:54rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.column{align-items:flex-start;flex-direction:column;padding:18rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:118rpx;font-size:26rpx}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;margin:0;color:#1769d8;background:#edf5ff;border-radius:12rpx}.modal-actions .primary{color:#fff;background:#1769d8}button::after{border:0}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.tip{margin:18rpx 0 0;color:#53677f;font-size:24rpx}.search{display:flex;align-items:center;height:80rpx;margin:16rpx 0;padding:0 20rpx;background:#fff;border-radius:16rpx}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:120rpx}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-success,.tag-draft{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-danger,.tag-cancelled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-progress{color:#b57800;background:#fff7dd;border:1rpx solid #f3dc98}.tag-approved{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-finished{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:24rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#1d2f46;font-size:30rpx;font-weight:600;text-align:center;border-bottom:1rpx solid #eef1f5}.field{display:flex;align-items:center;min-height:92rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:26rpx}.required{color:#e64340}.field>picker{display:block;flex:1;min-width:0}.field input,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:26rpx;text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:34rpx;text-align:right}.code-field input{flex:1}.code-field button{flex:none;min-width:132rpx;padding:0 14rpx;margin:0;color:#1769d8;font-size:23rpx;line-height:54rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.column{align-items:flex-start;flex-direction:column;padding:18rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:118rpx;font-size:26rpx}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;margin:0;color:#1769d8;background:#edf5ff;border-radius:12rpx}.modal-actions .primary{color:#fff;background:#1769d8}button::after{border:0}
</style>
src/pages/wls/warehouse/index.vue
@@ -79,5 +79,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-success{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-danger{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-success{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-danger{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/wls/warehouse/location.vue
@@ -121,5 +121,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.tip{margin:18rpx 0 0;color:#53677f;font-size:24rpx}.search{display:flex;align-items:center;height:80rpx;margin:16rpx 0;padding:0 20rpx;background:#fff;border-radius:16rpx}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:120rpx}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-success{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-danger{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view,.fab view::before{display:block;width:38rpx;height:8rpx;background:#fff;border-radius:4rpx;content:""}.fab view{position:relative}.fab view::before{position:absolute;transform:rotate(90deg)}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:24rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#1d2f46;font-size:30rpx;font-weight:600;text-align:center;border-bottom:1rpx solid #eef1f5}.field{display:flex;align-items:center;min-height:92rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:180rpx;flex:none;color:#33455d;font-size:26rpx}.required{color:#e64340}.field>picker{display:block;flex:1;min-width:0}.field input,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:26rpx;text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:34rpx;text-align:right}.code-field input{flex:1}.code-field button{flex:none;min-width:132rpx;padding:0 14rpx;margin:0;color:#1769d8;font-size:23rpx;line-height:54rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.column{align-items:flex-start;flex-direction:column;padding:18rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:118rpx;font-size:26rpx}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;margin:0;color:#1769d8;background:#edf5ff;border-radius:12rpx}.modal-actions .primary{color:#fff;background:#1769d8}button::after{border:0}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.tip{margin:18rpx 0 0;color:#53677f;font-size:24rpx}.search{display:flex;align-items:center;height:80rpx;margin:16rpx 0;padding:0 20rpx;background:#fff;border-radius:16rpx}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:120rpx}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-success{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-danger{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:24rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#1d2f46;font-size:30rpx;font-weight:600;text-align:center;border-bottom:1rpx solid #eef1f5}.field{display:flex;align-items:center;min-height:92rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:180rpx;flex:none;color:#33455d;font-size:26rpx}.required{color:#e64340}.field>picker{display:block;flex:1;min-width:0}.field input,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:26rpx;text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:34rpx;text-align:right}.code-field input{flex:1}.code-field button{flex:none;min-width:132rpx;padding:0 14rpx;margin:0;color:#1769d8;font-size:23rpx;line-height:54rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.column{align-items:flex-start;flex-direction:column;padding:18rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:118rpx;font-size:26rpx}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;margin:0;color:#1769d8;background:#edf5ff;border-radius:12rpx}.modal-actions .primary{color:#fff;background:#1769d8}button::after{border:0}
</style>