zhuangyunsheng hai 3 meses
pai
achega
b9a6b853c2

+ 8 - 0
src/api/model/carwash.js

@@ -37,12 +37,20 @@ export default {
             return await http.post(`${this.url}/getPage`, data);
         },
 
+        add: async function (data = {}) {
+            return await http.post(`${this.url}/save`, data);
+        },
+
         edit: async function (data = {}) {
             return await http.post(`${this.url}/update`, data);
         },
 
         del: async function (data = {}) {
             return await http.post(`${this.url}/remove`, data);
+        },
+
+        batchDel: async function (data = {}) {
+            return await http.post(`${this.url}/batchRemove`, data);
         }
     },
 

+ 16 - 4
src/components/scTable/index.vue

@@ -154,7 +154,8 @@ const gridOptions = ref({
     },
     checkboxConfig: {
         highlight: true,
-        range: true // 鼠标在复选框的列内滑动选中或取消指定行
+        range: true, // 鼠标在复选框的列内滑动选中或取消指定行
+        isShiftKey: true // 鼠标点击和 shift 键选取指定范围的行
     },
     tooltipConfig: {
         enterable: true
@@ -177,7 +178,7 @@ const gridOptions = ref({
         pageSize: config.pageSize,
         total: 0,
         slots: {
-            left: params => props.batchDel && h(pagerBatchDel, { params })
+            left: params => props.batchDel && h(pagerBatchDel, { params, onSuccess: ids => table_batch_del(ids) })
         },
         ...props.pagerConfig
     },
@@ -203,8 +204,6 @@ const resizeTable = () => {
 const getData = () => {
     if (!props.apiObj) return;
     nextTick(() => {
-        XEUtils.merge(gridOptions.value.formConfig, XEUtils.omit(XEUtils.get(props, "formConfig", {}), "items"));
-
         gridOptions.value.loading = true;
         const reqData = config.framework[props.framework].queryData(gridOptions.value, props.paramsColums);
         props.apiObj[props.apiKey](reqData).then(res => {
@@ -271,6 +270,19 @@ const exportEvent = async ($grid, options) => {
     });
 }
 
+const table_batch_del = ids => {
+    ElMessageBox.confirm("是否确认删除已选择的数据?", "删除警告", {
+        type: "warning",
+        confirmButtonText: "确定",
+        cancelButtonText: "取消"
+    }).then(() => {
+        props.apiObj.batchDel({ deleteIdList: ids }).then(() => {
+            ElMessage.success("操作成功");
+            getData();
+        });
+    });
+}
+
 defineExpose({
     selectedRows,
     toggleTableLoading,

+ 9 - 2
src/components/scTable/renderer/form-radio.vue

@@ -13,7 +13,7 @@ const props = defineProps({
     params: { type: Object, default: () => {} }
 })
 
-const modelValue = ref(XEUtils.get(props.params.data, props.params.field) || null);
+const modelValue = ref(XEUtils.get(props.params.data, props.params.field));
 const optionProps = reactive(props.renderOpts.optionProps || config.props);
 
 const formatOptions = (key, { item, index }) => {
@@ -22,4 +22,11 @@ const formatOptions = (key, { item, index }) => {
 };
 
 const compChange = () => props.renderOpts.events.change({ [props.params.field]: modelValue.value });
-</script>
+</script>
+
+<style scoped>
+@media (max-width: 1120px) {
+    .el-radio-group {flex-wrap: nowrap;} 
+    .el-radio {margin-right: 10px;}
+}
+</style>

+ 4 - 7
src/components/scTable/renderer/pager-batch-del.vue

@@ -1,21 +1,18 @@
 <template>
-    <el-button type="danger" plain :disabled="!ids || !ids.length" @click="batchDel">批量删除</el-button>
+    <el-button type="danger" plain :disabled="!ids || !ids.length" @click="$emit('success', ids)">批量删除</el-button>
 </template>
 
 <script setup>
 import XEUtils from "xe-utils";
 
+const $emit = defineEmits(["success"]);
 const props = defineProps({
-    params: { type: Object, default: () => {} }
+    params: { type: Object, default: () => {} },
+    apiObj: { type: Object, default: () => {} }
 })
 
 const ids = ref([]);
-
 watch(() => props.params.$grid?.getCheckboxRecords(), val => ids.value = XEUtils.map(val, item => item.id))
-
-const batchDel = () => {
-    console.log('batchDel: ids',ids.value)
-};
 </script>
 
 <style scoped>

+ 1 - 1
src/views/dataMock/carwash/components/info/detail.vue

@@ -50,7 +50,7 @@ const isSaving = ref(false);
 
 const mode = ref("add");
 const titleMap = reactive({
-    add: "新增",
+    add: "车辆录入",
     edit: "修改"
 });
 

+ 3 - 1
src/views/dataMock/carwash/components/info/index.vue

@@ -45,7 +45,8 @@ const toolbarConfig = reactive({
 const formConfig = reactive({
     data: {
         orderBy: "createTime_desc",
-        projectId: TOOL.data.get("PROJECT_ID")
+        projectId: TOOL.data.get("PROJECT_ID"),
+        projectIdNot: 1
     },
     items: [
         mapFormItemSelect("projectId", "所属项目", proConfig),
@@ -59,6 +60,7 @@ const formConfig = reactive({
 const paramsColums = reactive([
     { column: "orderBy" },
     { column: "projectId" },
+    { column: "projectIdNot" },
     { column: "plateNumberLike" },
     { column: "vehicleType" },
     { column: "vehicleColor" },

+ 18 - 4
src/views/dataMock/carwash/components/monos.vue

@@ -13,11 +13,20 @@ import moment from "moment";
 import XEUtils from "xe-utils";
 import API from "@/api";
 import TOOL from "@/utils/tool";
-import { mapFormItemSelect, mapFormItemDatePicker } from "@/components/scTable/helper";
+import { mapFormItemSelect, mapFormItemRadio, mapFormItemDatePicker } from "@/components/scTable/helper";
 import { objectToArray } from "@/utils/basicDic";
 import { taskStateDic } from "../main";
 
+const radioConfig = reactive({
+    span: 5,
+    options: [{ label: "是", value: true }, { label: "否", value: false }],
+    events: {
+        change: data => XEUtils.merge(formConfig.data, data)
+    }
+})
+
 const proConfig = reactive({
+    visibleMethod: ({ data }) => !data.isTemp,
     storageKey: "PROJECT",
     resetValue: TOOL.data.get("PROJECT_ID"),
     optionProps: { label: "projectName", value: "fpiId" },
@@ -46,7 +55,6 @@ const datetimerangeConfig = reactive({
     span: 7,
     resetValue: () => [moment().startOf("month").format("YYYY-MM-DD HH:mm:ss"), moment().format("YYYY-MM-DD HH:mm:ss")],
     props: {
-        popperClass: "datetime-picker-popper",
         type: "datetimerange",
         startPlaceholder: "开始时间",
         endPlaceholder: "结束时间",
@@ -61,14 +69,18 @@ const toolbarConfig = reactive({
 
 const formConfig = reactive({
     data: {
+        isTemp: false,
+
         orderBy: "createTime_desc",
         parentId: "0",
         projectId: TOOL.data.get("PROJECT_ID"),
+        projectIdNot: 1,
         taskType: "car_rinse",
         dateRange: [],
         createTime: [moment().startOf("month").format("YYYY-MM-DD HH:mm:ss"), moment().format("YYYY-MM-DD HH:mm:ss")]
     },
     items: [
+        mapFormItemRadio("isTemp", "是否模版项目", radioConfig),
         mapFormItemSelect("projectId", "所属项目", proConfig),
         mapFormItemSelect("taskStatus", "任务状态", selectConfig),
         mapFormItemDatePicker("dateRange", "时间范围", daterangeConfig),
@@ -76,11 +88,12 @@ const formConfig = reactive({
     ]
 })
 
-const paramsColums = reactive([
+const paramsColums = computed(() => [
     { column: "orderBy" },
-    { column: "projectId" },
     { column: "parentId" },
     { column: "taskType" },
+    { column: "projectId", field: formConfig.data.isTemp ? "projectIdNot" : "projectId" },
+    !formConfig.data.isTemp && { column: "projectIdNot" },
     { column: "taskStatus" },
     { column: "planBeginTimeBegin", field: "dateRange[0]" },
     { column: "planEndTimeEnd", field: "dateRange[1]" },
@@ -90,6 +103,7 @@ const paramsColums = reactive([
 
 const columns = reactive([
     { type: "seq", width: 60 },
+    { type: "html", field: "projectName", title: "项目名称", minWidth: 160, sortable: true, formatter: ({ cellValue, row }) => cellValue || row.projectId == 1 ? "模版项目" : XEUtils.get(XEUtils.find(TOOL.data.get("PROJECT"), item => item.fpiId == row.projectId), "projectName") },
     { type: "html", field: "planNumber", title: "任务总数", minWidth: 100, sortable: true },
     { type: "html", field: "finishNumber", title: "已完成数量", minWidth: 120, sortable: true },
     { type: "html", field: "taskStatus", title: "任务状态", minWidth: 100, sortable: true, formatter: ({ cellValue }) => XEUtils.get(taskStateDic, cellValue, cellValue) },

+ 24 - 4
src/views/dataMock/carwash/components/record/detail.vue

@@ -1,7 +1,14 @@
 <template>
-    <el-dialog v-model="visible" title="修改" width="860" :close-on-click-modal="false" @closed="$emit('closed')">
+    <el-dialog v-model="visible" :title="titleMap[mode]" width="860" :close-on-click-modal="false" @closed="$emit('closed')">
         <el-form ref="formRef" :model="form" :rules="rules" label-width="120">
             <el-row>
+                <el-col v-if="props.projectId != 1" :md="12" :xs="24">
+                    <el-form-item label="所属项目" prop="fpiId">
+                        <el-select v-model="form.fpiId" filterable placeholder="请选择所属项目">
+                            <el-option v-for="item in $TOOL.data.get('PROJECT')" :key="item.fpiId" :label="item.projectName" :value="item.fpiId"></el-option>
+                        </el-select>
+                    </el-form-item>
+                </el-col>
                 <el-col :md="12" :xs="24">
                     <el-form-item label="车牌号" prop="licensePlate">
                         <el-input v-model="form.licensePlate" placeholder="请输入车牌号"></el-input>
@@ -17,7 +24,7 @@
                 <el-col :md="12" :xs="24">
                     <el-form-item label="车牌颜色" prop="licensePlateColor">
                         <el-select v-model="form.licensePlateColor" placeholder="请选择车牌颜色">
-                            <el-option v-for="(label, key) in carWashDic.plateColor" :key="key" :label="label" :value="key"></el-option>
+                            <el-option v-for="(label, key) in carWashDic.plateColor.slice(1)" :key="key" :label="label" :value="key + 1"></el-option>
                         </el-select>
                     </el-form-item>
                 </el-col>
@@ -73,11 +80,22 @@ import { carWashDic } from "@/views/dataMock/carwash/main";
 import scUpload from "@/components/scUpload/index";
 
 const $emit = defineEmits(["success", "closed"]);
+const props = defineProps({
+    projectId: { type: Number, default: TOOL.data.get("PROJECT_ID") }
+});
+
 const visible = ref(false);
 const isSaving = ref(false);
 
+const mode = ref("add");
+const titleMap = reactive({
+    add: "数据录入",
+    edit: "修改"
+});
+
 const form = ref({
     id: null,
+    fpiId: props.projectId,
     carType: null,
     licensePlate: null,
     licensePlateColor: null,
@@ -96,6 +114,7 @@ const form = ref({
     }
 });
 const rules = reactive({
+    fpiId: [{ required: true, message: "请选择所属项目" }],
     licensePlate: [{ required: true, message: "请输入车牌号" }],
     carType: [{ required: true, message: "请选择车辆类型" }],
     licensePlateColor: [{ required: true, message: "请选择车牌颜色" }],
@@ -114,6 +133,7 @@ const rules = reactive({
 const open = () => visible.value = true;
 const setData = data => {
     open();
+    mode.value = "edit";
     XEUtils.objectEach(form.value, (_, key) => {
         if (key == "folders") {
             XEUtils.objectEach(form.value.folders, (_, folder_key) => {
@@ -139,11 +159,11 @@ const submit = () => {
             !XEUtils.isEmpty(folders) && XEUtils.set(data, "folders", folders);
 
             isSaving.value = true;
-            API.carwash.record.edit(data).then(() => {
+            API.carwash.record[mode.value](data).then(() => {
                 isSaving.value = false;
                 ElMessage.success("操作成功");
                 visible.value = false;
-                $emit("success");
+                $emit("success", mode.value);
             }).catch(() => isSaving.value = false);
         } else {
             return false;

+ 19 - 4
src/views/dataMock/carwash/components/record/index.vue

@@ -16,7 +16,7 @@
         </template>
     </scTable>
 
-    <record-detail v-if="dialog" ref="recordRef" @success="refreshTable" @closed="dialog = false"></record-detail>
+    <record-detail v-if="dialog" ref="recordRef" :projectId="props.isTemp ? 1 : TOOL.data.get('PROJECT_ID')" @success="refreshTable" @closed="dialog = false"></record-detail>
 </template>
 
 <script setup>
@@ -30,10 +30,12 @@ import recordDetail from "./detail";
 
 const props = defineProps({
     options: { type: Object, default: () => {} },
+    isTemp: { type: Boolean, default: false },
     hideHandler: { type: Boolean, default: false }
 })
 
 const proConfig = reactive({
+    visible: !props.isTemp,
     storageKey: "PROJECT",
     resetValue: TOOL.data.get("PROJECT_ID"),
     optionProps: { label: "projectName", value: "fpiId" },
@@ -69,6 +71,7 @@ const formConfig = reactive({
     data: {
         orderBy: "createTime_desc",
         projectId: TOOL.data.get("PROJECT_ID"),
+        fpiIdNot: 1,
         createTime: [moment().startOf("month").format("YYYY-MM-DD HH:mm:ss"), moment().format("YYYY-MM-DD HH:mm:ss")]
     },
     items: [
@@ -76,13 +79,14 @@ const formConfig = reactive({
         mapFormItemDatePicker("createTime", "抓拍时间", datetimerangeConfig),
         mapFormItemInput("licensePlate", "车牌号", { span: 5 }),
         mapFormItemSelect("carType", "车辆类型", selectConfig),
-        mapFormItemSelect("alarmType", "识别结果", { ...selectConfig, options: carWashDic.alarmType.map((label, value) => ({ label, value })) }),
+        mapFormItemSelect("alarmType", "识别结果", { ...selectConfig, options: carWashDic.alarmType.map((label, value) => ({ label, value })).slice(1) }),
     ]
 })
 
 const paramsColums = reactive([
     { column: "orderBy" },
-    { column: "fpiId", field: "projectId" },
+    { column: "fpiId", field: props.isTemp ? "fpiIdNot" : "projectId" },
+    !props.isTemp && { column: "fpiIdNot" },
     { column: "licensePlate" },
     { column: "carType" },
     { column: "alarmType" },
@@ -91,7 +95,9 @@ const paramsColums = reactive([
 ])
 
 const columns = reactive([
+    { visible: !props.hideHandler, type: "checkbox", fixed: "left", width: 40 },
     { type: "seq", fixed: "left", width: 60 },
+    { type: "html", field: "projectName", title: "项目名称", minWidth: 160, sortable: true, formatter: ({ cellValue, row }) => cellValue || row.fpiId == 1 ? "模版项目" : XEUtils.get(XEUtils.find(TOOL.data.get("PROJECT"), item => item.fpiId == row.fpiId), "projectName") },
     { type: "html", field: "captureTime", title: "抓拍时间", minWidth: 160, sortable: true },
     { type: "html", field: "enterTime", title: "车辆入场时间", minWidth: 160, sortable: true },
     { type: "html", field: "leaveTime", title: "车辆出场时间", minWidth: 160, sortable: true },
@@ -112,6 +118,7 @@ const imageToolbar = reactive({
 // 显示隐藏 筛选表单
 const xGridTable = ref();
 const toggleFormEnabled = () => xGridTable.value.toggleFormEnabled();
+const getTableTotal = () => xGridTable.value.getTableData().tableData.length;
 
 const refreshTable = () => {
     xGridTable.value.reloadColumn(columns);
@@ -120,6 +127,12 @@ const refreshTable = () => {
 
 const recordRef = ref();
 const dialog = ref(false);
+
+const table_add = () => {
+    dialog.value = true;
+    nextTick(() => recordRef.value?.open());
+}
+
 const table_edit = row => {
     dialog.value = true;
     nextTick(() => recordRef.value?.setData(row));
@@ -139,6 +152,8 @@ const table_del = ({ id }) => {
 }
 
 defineExpose({
-    refreshTable
+    table_add,
+    refreshTable,
+    getTableTotal
 })
 </script>

+ 0 - 104
src/views/dataMock/carwash/components/template/detail.vue

@@ -1,104 +0,0 @@
-<template>
-    <el-dialog v-model="visible" :title="titleMap[mode]" width="480" :close-on-click-modal="false" @closed="$emit('closed')">
-        <el-form ref="formRef" :model="form" :rules="rules" label-width="120">
-            <el-form-item label="车牌号" prop="plateNumber">
-                <el-input v-model="form.plateNumber" placeholder="请输入车牌号"></el-input>
-            </el-form-item>
-            <el-form-item label="车辆类型:" prop="vehicleType">
-                <el-select v-model="form.vehicleType" placeholder="请选择车辆类型">
-                    <el-option v-for="(label, key) in carWashDic.carType" :key="key" :label="label" :value="key + ''"></el-option>
-                </el-select>
-            </el-form-item>
-            <el-form-item label="车辆颜色:" prop="vehicleColor">
-                <el-select v-model="form.vehicleColor" placeholder="请选择车辆颜色">
-                    <el-option v-for="(label, key) in carWashDic.carColor" :key="key" :label="label" :value="key + ''"></el-option>
-                </el-select>
-            </el-form-item>
-            <el-form-item label="使用状态:" prop="isSupervise">
-                <el-select v-model="form.isSupervise" placeholder="请选择使用状态">
-                    <el-option label="使用中" :value="true"></el-option>
-                    <el-option label="已拆除" :value="false"></el-option>
-                </el-select>
-            </el-form-item>
-            <el-form-item label="数据来源:">
-                <el-select v-model="form.dataSources" clearable placeholder="请选择数据来源">
-                    <el-option label="三方系统推送" :value="0"></el-option>
-                    <el-option label="其他" :value="1"></el-option>
-                </el-select>
-            </el-form-item>
-        </el-form>
-
-        <template #footer>
-            <el-button :loading="isSaving" type="primary" auto-insert-space @click="submit">保存</el-button>
-            <el-button auto-insert-space @click="visible = false">取消</el-button>
-        </template>
-    </el-dialog>
-</template>
-
-<script setup>
-import XEUtils from "xe-utils";
-import API from "@/api";
-import TOOL from "@/utils/tool";
-import { carWashDic } from "@/views/dataMock/carwash/main";
-
-const $emit = defineEmits(["success", "closed"]);
-const visible = ref(false);
-const isSaving = ref(false);
-
-const mode = ref("add");
-const titleMap = reactive({
-    add: "新增",
-    edit: "修改"
-});
-
-const form = ref({
-    id: null,
-    projectId: TOOL.data.get("PROJECT_ID"),
-    plateNumber: null,
-    vehicleType: null,
-    vehicleColor: null,
-    isSupervise: null,
-    dataSources: null
-});
-const rules = reactive({
-    plateNumber: [{ required: true, message: "请输入车牌号" }],
-    vehicleType: [{ required: true, message: "请选择车辆类型" }],
-    vehicleColor: [{ required: true, message: "请选择车辆颜色" }],
-    isSupervise: [{ required: true, message: "请选择使用状态" }]
-})
-
-const open = () => visible.value = true;
-const setData = data => {
-    open();
-    mode.value = "edit";
-    XEUtils.objectEach(form.value, (_, key) => XEUtils.set(form.value, key, XEUtils.get(data, key)));
-}
-
-const formRef = ref();
-const submit = () => {
-    formRef.value.validate(valid => {
-        if (valid) {
-            isSaving.value = true;
-            API.carwash.carInfo[mode.value](form.value).then(res => {
-                isSaving.value = false;
-                ElMessage.success("操作成功");
-                visible.value = false;
-                $emit("success", mode.value);
-            }).catch(() => isSaving.value = false);
-        } else {
-            return false;
-        }
-    });
-}
-
-defineExpose({
-    open,
-    setData
-})
-</script>
-
-<style scoped>
-.el-form {
-    padding-right: calc(var(--el-dialog-padding-primary) + var(--el-message-close-size, 16px));
-}
-</style>

+ 5 - 110
src/views/dataMock/carwash/components/template/index.vue

@@ -1,117 +1,12 @@
 <template>
-    <scTable ref="xGridTable" :apiObj="$API.carwash.record" :formConfig="formConfig" :paramsColums="paramsColums" :toolbarConfig="toolbarConfig" :columns="columns">
-        <template #default_imgUrl="{ row, column }">
-            <vxe-image v-if="XEUtils.get(row, `folders.${column.field}.entities[0].path`)" :src="'/api/folder/' + XEUtils.get(row, `folders.${column.field}.entities[0].path`)" width="40" height="40"></vxe-image>
-        </template>
-        
-        <template #action="{ row }">
-            <el-button type="primary" link @click="table_edit(row)">
-                <template #icon><sc-iconify icon="ant-design:edit-outlined"></sc-iconify></template>修改
-            </el-button>
-            <el-button type="primary" link @click="table_del(row)">
-                <template #icon><sc-iconify icon="ant-design:delete-outlined"></sc-iconify></template>删除
-            </el-button>
-        </template>
-    </scTable>
+    <data-table ref="tableRef" isTemp></data-table>
 </template>
 
 <script setup>
-import moment from "moment";
-import XEUtils from "xe-utils";
-import API from "@/api";
-import TOOL from "@/utils/tool";
-import { mapFormItemInput, mapFormItemSelect, mapFormItemDatePicker } from "@/components/scTable/helper";
-import { carWashDic } from "@/views/dataMock/carwash/main";
+import dataTable from "../record";
 
-const proConfig = reactive({
-    storageKey: "PROJECT",
-    resetValue: TOOL.data.get("PROJECT_ID"),
-    optionProps: { label: "projectName", value: "fpiId" },
-    events: {
-        change: data => XEUtils.assign(formConfig.data, data)
-    }
+const tableRef = ref();
+defineExpose({
+    table_add: () => tableRef.value.table_add()
 })
-
-const selectConfig = reactive({
-    options: carWashDic.carType.map((label, value) => ({ label, value })),
-    events: {
-        change: data => XEUtils.merge(formConfig.data, data)
-    }
-})
-
-const datetimerangeConfig = reactive({
-    span: 7,
-    resetValue: () => [moment().startOf("month").format("YYYY-MM-DD HH:mm:ss"), moment().format("YYYY-MM-DD HH:mm:ss")],
-    props: {
-        popperClass: "datetime-picker-popper",
-        type: "datetimerange",
-        startPlaceholder: "开始时间",
-        endPlaceholder: "结束时间",
-        format: "YYYY-MM-DD HH:mm"
-    }
-})
-
-const toolbarConfig = reactive({
-    enabled: true,
-    print: false
-})
-
-const formConfig = reactive({
-    data: {
-        projectId: TOOL.data.get("PROJECT_ID"),
-        createTime: [moment().startOf("month").format("YYYY-MM-DD HH:mm:ss"), moment().format("YYYY-MM-DD HH:mm:ss")]
-    },
-    items: [
-        mapFormItemSelect("projectId", "所属项目", proConfig),
-        mapFormItemInput("licensePlate", "车牌号"),
-        mapFormItemSelect("carType", "车辆类型", selectConfig),
-        mapFormItemSelect("alarmType", "识别结果", { ...selectConfig, options: carWashDic.alarmType.map((label, value) => ({ label, value })) }),
-        mapFormItemDatePicker("createTime", "抓拍时间", datetimerangeConfig)
-    ]
-})
-
-const paramsColums = reactive([
-    { column: "fpiId", field: "projectId" },
-    { column: "licensePlate" },
-    { column: "carType" },
-    { column: "alarmType" },
-    { column: "beginCaptureTime", field: "createTime[0]" },
-    { column: "endCaptureTime", field: "createTime[1]" }
-])
-
-const columns = reactive([
-    { type: "seq", width: 60 },
-    { type: "html", field: "captureTime", title: "抓拍时间", minWidth: 160, sortable: true },
-    { type: "html", field: "enterTime", title: "车辆入场时间", minWidth: 160, sortable: true },
-    { type: "html", field: "leaveTime", title: "车辆出场时间", minWidth: 160, sortable: true },
-    { type: "html", field: "licensePlate", title: "车牌号", minWidth: 120, sortable: true },
-    { type: "html", field: "licensePlateColor", title: "车牌颜色", minWidth: 120, sortable: true, formatter: ({ cellValue }) => XEUtils.get(carWashDic.plateColor, cellValue, cellValue) },
-    { type: "html", field: "carType", title: "车辆类型", minWidth: 120, sortable: true, formatter: ({ cellValue }) => XEUtils.get(carWashDic.carType, cellValue, cellValue) },
-    { type: "html", field: "alarmType", title: "识别结果", minWidth: 100, sortable: true, formatter: ({ cellValue }) => XEUtils.get(carWashDic.alarmType, cellValue, cellValue) },
-    { field: "carrinse/attach", title: "车身清洗图片", minWidth: 110, align: "center", slots: { default: "default_imgUrl" } },
-    { field: "carrinse/side", title: "后盖密闭图片", minWidth: 110, align: "center", slots: { default: "default_imgUrl" } },
-    { title: "操作", fixed: "right", width: 140, align: "center", slots: { default: "action" } }
-])
-
-// 显示隐藏 筛选表单
-const xGridTable = ref();
-const toggleFormEnabled = () => xGridTable.value.toggleFormEnabled();
-
-const refreshTable = () => {
-    xGridTable.value.reloadColumn(columns);
-    xGridTable.value.searchData();
-}
-
-const table_stop = row => {
-    ElMessageBox.confirm("是否确认终止该任务?", "提示", {
-        type: "warning",
-        confirmButtonText: "确定",
-        cancelButtonText: "取消"
-    }).then(() => {
-        API.common.opsTask.stop({ id: row.id }).then(() => {
-            ElMessage.success("操作成功");
-            refreshTable();
-        });
-    });
-}
 </script>

+ 22 - 15
src/views/dataMock/carwash/detail.vue

@@ -23,7 +23,7 @@
                 </el-col>
                 <el-col :md="12" :xs="24">
                     <el-form-item label="模拟月份">
-                        <el-select v-model="form.targetMonth" filterable placeholder="请选择模拟月份">
+                        <el-select v-model="form.targetMonth" filterable clearable placeholder="请选择模拟月份">
                             <el-option v-for="item in 12" :key="item" :label="item + '月'" :value="XEUtils.padStart(item, 2, '0')"></el-option>
                         </el-select>
                     </el-form-item>
@@ -38,7 +38,7 @@
                 </el-col>
                 <el-col :md="12" :xs="24">
                     <el-form-item style="margin-bottom: 0;" label="数据来源" prop="source">
-                        <el-radio-group v-model="form.source">
+                        <el-radio-group v-model="form.source" @change="refreshTable">
                             <el-radio value="template">模版项目</el-radio>
                             <el-radio value="other">其他项目</el-radio>
                         </el-radio-group>
@@ -49,7 +49,7 @@
             <el-divider />
 
             <el-row>
-                <el-col :md="12" :xs="24">
+                <el-col v-if="form.source == 'other'" :md="12" :xs="24">
                     <el-form-item label="数据源项目" prop="sourceProjectId">
                         <el-select v-model="form.sourceProjectId" filterable placeholder="请选择数据源项目" @change="refreshTable">
                             <el-option v-for="item in $TOOL.data.get('PROJECT')" :key="item.fpiId" :label="item.projectName" :value="item.fpiId"></el-option>
@@ -67,7 +67,8 @@
         </el-form>
 
         <template #footer>
-            <el-button :loading="isSaving" type="primary" auto-insert-space @click="submit">保存</el-button>
+            <el-button :loading="isSaving" type="primary" auto-insert-space @click="submit()">提交</el-button>
+            <el-button v-if="form.source == 'other'" :loading="isSaving" type="primary" auto-insert-space @click="submit('template')">保存为模版</el-button>
             <el-button auto-insert-space @click="visible = false">取消</el-button>
         </template>
     </el-dialog>
@@ -91,6 +92,7 @@ const form = ref({
     isCover: false,
     source: "other",
     sourceProjectId: null,
+    sourceProjectIdNot: 1,
     sourceTime: []
 });
 
@@ -100,21 +102,22 @@ const rules = reactive({
     isCover: [{ required: true }],
     source: [{ required: true }],
     sourceProjectId: [{ required: true, message: "请选择数据源项目" }],
-    sourceTime: [{ required: true, message: "请选择数据源抓拍时间" }],
+    sourceTime: [{ required: true, message: "请选择数据源抓拍时间" }]
 })
 
 const tableRef = ref();
-const tableOptions = computed(() => ({
+const tableOptions = reactive({
     batchDel: false,
     maxHeight: 1048,
     toolbarConfig: { enabled: true, print: false, zoom: false },
-    paramsColums: [
-        { column: "fpiId", field: "sourceProjectId" },
+    formConfig: { enabled: false, data: form },
+    paramsColums: computed(() => [
+        { column: "fpiId", field: form.value.source == "other" ? "sourceProjectId" : "sourceProjectIdNot" },
+        form.value.source == "other" && { column: "fpiIdNot", field: "sourceProjectIdNot" },
         { column: "captureTimeBegin", field: "sourceTime[0]" },
         { column: "captureTimeEnd", field: "sourceTime[1]" }
-    ],
-    formConfig: { enabled: false, data: XEUtils.pick(form.value, "sourceProjectId", "sourceTime") },
-}))
+    ])
+})
 const refreshTable = () => tableRef.value.refreshTable();
 
 
@@ -134,13 +137,17 @@ const open = () => {
 }
 
 const formRef = ref();
-const submit = () => {
+const submit = key => {
     formRef.value.validate(valid => {
         if (valid) {
-            const data = XEUtils.omit(form.value, "source", "sourceTime");
-            XEUtils.set(data, "sourceBeginTime", XEUtils.first(form.value.sourceTime))
-            XEUtils.set(data, "sourceEndTime", XEUtils.last(form.value.sourceTime))
+            if (tableRef.value.getTableTotal() == 0) return ElMessage.warning("暂无相关数据,请调整条件后重试。");
             
+            const data = XEUtils.omit(form.value, "source", "sourceProjectIdNot", "sourceTime");
+            XEUtils.set(data, "sourceBeginTime", XEUtils.first(form.value.sourceTime));
+            XEUtils.set(data, "sourceEndTime", XEUtils.last(form.value.sourceTime));
+            form.value.source == "template" && XEUtils.set(data, "sourceProjectId", 1);
+            key == "template" && XEUtils.set(data, "targetProjectId", 1);
+
             isSaving.value = true;
             API.carwash.copyData.add(data).then(() => {
                 isSaving.value = false;

+ 1 - 0
src/views/dataMock/carwash/index.vue

@@ -3,6 +3,7 @@
         <sc-page-header addText="数据模拟" @add="mock_add">
             <template #extra-right>
                 <el-button v-if="activeName == 'info'" type="primary" @click="table_add">车辆录入</el-button>
+                <el-button v-if="activeName == 'record' || activeName == 'template'" type="primary" @click="table_add">数据录入</el-button>
             </template>
         </sc-page-header>