yuansh 1 månad sedan
förälder
incheckning
7d860cdab2

+ 81 - 0
src/views/afterCode/AfterScheduling/AfterScheduling.api.ts

@@ -0,0 +1,81 @@
+import {defHttp} from '/@/utils/http/axios';
+import { useMessage } from "/@/hooks/web/useMessage";
+
+const { createConfirm } = useMessage();
+
+enum Api {
+  list = '/afterCode/afterScheduling/list',
+  save='/afterCode/afterScheduling/add',
+  edit='/afterCode/afterScheduling/edit',
+  deleteOne = '/afterCode/afterScheduling/delete',
+  deleteBatch = '/afterCode/afterScheduling/deleteBatch',
+  importExcel = '/afterCode/afterScheduling/importExcel',
+  exportXls = '/afterCode/afterScheduling/exportXls',
+  queryDataById = '/afterCode/afterScheduling/queryById',
+  afterSchedulingShipList = '/afterCode/afterScheduling/queryAfterSchedulingShipByMainId',
+}
+/**
+ * 导出api
+ * @param params
+ */
+export const getExportUrl = Api.exportXls;
+
+/**
+ * 导入api
+ */
+export const getImportUrl = Api.importExcel;
+
+/**
+ * 查询子表数据
+ * @param params
+ */
+export const queryAfterSchedulingShipListByMainId = (id) => defHttp.get({url: Api.afterSchedulingShipList, params:{ id }});
+
+/**
+ * 列表接口
+ * @param params
+ */
+export const list = (params) =>
+  defHttp.get({url: Api.list, params});
+
+/**
+ * 删除单个
+ */
+export const deleteOne = (params,handleSuccess) => {
+  return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {
+    handleSuccess();
+  });
+}
+/**
+ * 批量删除
+ * @param params
+ */
+export const batchDelete = (params, handleSuccess) => {
+  createConfirm({
+    iconType: 'warning',
+    title: '确认删除',
+    content: '是否删除选中数据',
+    okText: '确认',
+    cancelText: '取消',
+    onOk: () => {
+      return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {
+        handleSuccess();
+      });
+    }
+  });
+}
+/**
+ * 保存或者更新
+ * @param params
+ */
+export const saveOrUpdate = (params, isUpdate) => {
+  let url = isUpdate ? Api.edit : Api.save;
+  return defHttp.post({url: url, params});
+}
+
+/**
+* 根据id查询数据
+* @param params
+*/
+export const queryDataById = (id) => defHttp.get({url: Api.queryDataById, params:{ id }});
+

+ 144 - 0
src/views/afterCode/AfterScheduling/AfterScheduling.data.ts

@@ -0,0 +1,144 @@
+import {BasicColumn} from '/@/components/Table';
+import {FormSchema} from '/@/components/Table';
+import { rules} from '/@/utils/helper/validator';
+import { render } from '/@/utils/common/renderUtils';
+import {JVxeTypes,JVxeColumn} from '/@/components/jeecg/JVxeTable/types'
+import { getWeekMonthQuarterYear } from '/@/utils';
+//列表数据
+export const columns: BasicColumn[] = [
+   {
+    title: '提交',
+    align:"center",
+    dataIndex: 'submit_dictText'
+   },
+   {
+    title: '单据日期',
+    align:"center",
+    dataIndex: 'billDate',
+    customRender:({text}) =>{
+      text = !text ? "" : (text.length > 10 ? text.substr(0,10) : text);
+      return text;
+    },
+   },
+   {
+    title: '项目名称',
+    align:"center",
+    dataIndex: 'projectName'
+   },
+   {
+    title: '其他项目',
+    align:"center",
+    dataIndex: 'otherProject'
+   },
+  
+   {
+    title: '客户名称',
+    align:"center",
+    dataIndex: 'customerName'
+   },
+   {
+    title: '地点(address)',
+    align:"center",
+    dataIndex: 'address'
+   },
+   {
+    title: '排班日期(scheduling date)',
+    align:"center",
+    dataIndex: 'schedulingDateBegin',
+    customRender:({text}) =>{
+      text = !text ? "" : (text.length > 10 ? text.substr(0,10) : text);
+      return text;
+    },
+   },
+   {
+    title: '排班人员(scheduling man)',
+    align:"center",
+    dataIndex: 'schedulingMan'
+   },
+   {
+    title: '备注(notes)',
+    align:"center",
+    dataIndex: 'notes'
+   },
+];
+
+//子表表格配置
+export const afterSchedulingShipColumns: JVxeColumn[] = [
+    {
+      title: '船id',
+      key: 'shipId',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '船名',
+      key: 'shipName',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '主机号',
+      key: 'hostNumber',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '工程编号',
+      key: 'projectNo',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '船厂',
+      key: 'shipFactory',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '船东',
+      key: 'shipowner',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+  ]
+
+// 高级查询数据
+export const superQuerySchema = {
+  submit: {title: '提交(submit)1是0否',order: 1,view: 'number', type: 'number',dictCode: '',},
+  billDate: {title: '单据日期',order: 2,view: 'date', type: 'string',},
+  project: {title: '项目',order: 3,view: 'text', type: 'string',},
+  projectName: {title: '项目名称',order: 4,view: 'text', type: 'string',},
+  otherProject: {title: '其他项目',order: 5,view: 'text', type: 'string',},
+  customer: {title: '客户',order: 6,view: 'text', type: 'string',},
+  customerName: {title: '客户名称',order: 7,view: 'text', type: 'string',},
+  address: {title: '地点(address)',order: 8,view: 'text', type: 'string',},
+  schedulingDateBegin: {title: '排班日期(scheduling date)开始',order: 9,view: 'date', type: 'string',},
+  schedulingDateEnd: {title: '排班日期(scheduling date)结束',order: 10,view: 'date', type: 'string',},
+  schedulingMan: {title: '排班人员(scheduling man)',order: 11,view: 'text', type: 'string',},
+  notes: {title: '备注(notes)',order: 12,view: 'text', type: 'string',},
+  //子表高级查询
+  afterSchedulingShip: {
+    title: '运维排班-船明细',
+    view: 'table',
+    fields: {
+        shipId: {title: '船id',order: 0,view: 'text', type: 'string',},
+        shipName: {title: '船名',order: 1,view: 'text', type: 'string',},
+        hostNumber: {title: '主机号',order: 2,view: 'text', type: 'string',},
+        projectNo: {title: '工程编号',order: 3,view: 'text', type: 'string',},
+        shipFactory: {title: '船厂',order: 4,view: 'text', type: 'string',},
+        shipowner: {title: '船东',order: 5,view: 'text', type: 'string',},
+    }
+  },
+};

+ 323 - 0
src/views/afterCode/AfterScheduling/AfterSchedulingList.vue

@@ -0,0 +1,323 @@
+<template>
+  <div class="p-2">
+    <!--查询区域-->
+    <div class="jeecg-basic-table-form-container">
+      <a-form ref="formRef" @keyup.enter.native="reload" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
+        <a-row :gutter="24">
+          
+          <a-col :lg="8">
+            <a-form-item name="billDate">
+              <template #label><span title="单据日期">单据日期</span></template>
+              <a-range-picker value-format="YYYY-MM-DD"  v-model:value="queryParam.billDate" class="query-group-cust"/>
+            </a-form-item>
+          </a-col>
+            <a-col :lg="8">
+              <a-form-item name="projectName">
+                <template #label><span title="项目名称">项目名称</span></template>
+                <a-input placeholder="请输入项目名称" v-model:value="queryParam.projectName" allow-clear ></a-input>
+              </a-form-item>
+            </a-col>
+          <template v-if="toggleSearchStatus">
+            <a-col :lg="8">
+              <a-form-item name="otherProject">
+                <template #label><span title="其他项目">其他项目</span></template>
+                <a-input placeholder="请输入其他项目" v-model:value="queryParam.otherProject" allow-clear ></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :lg="8">
+              <a-form-item name="customerName">
+                <template #label><span title="客户名称">客户名称</span></template>
+                <a-input placeholder="请输入客户名称" v-model:value="queryParam.customerName" allow-clear ></a-input>
+              </a-form-item>
+            </a-col>
+			
+			<a-col :lg="8">
+			  <a-form-item name="submit">
+			    <template #label><span title="提交(submit)">提交(submit)</span></template>
+			    <JDictSelectTag v-model:value="queryParam.submit" placeholder="请选择" dictCode="yes_or_no" />
+			  </a-form-item>
+			</a-col>
+            <a-col :lg="8">
+              <a-form-item name="schedulingDateBegin">
+                <template #label><span title="排班日期(scheduling date)开始">排班日期</span></template>
+                <a-range-picker value-format="YYYY-MM-DD"  v-model:value="queryParam.schedulingDateBegin" class="query-group-cust"/>
+              </a-form-item>
+            </a-col>
+            <a-col :lg="8">
+              <a-form-item name="schedulingDateEnd">
+                <template #label><span title="排班日期(scheduling date)结束">排班日期</span></template>
+                <a-range-picker value-format="YYYY-MM-DD"  v-model:value="queryParam.schedulingDateEnd" class="query-group-cust"/>
+              </a-form-item>
+            </a-col>
+            <a-col :lg="8">
+              <a-form-item name="schedulingMan">
+                <template #label><span title="排班人员(scheduling man)">排班人员</span></template>
+                <JRangeNumber v-model:value="queryParam.schedulingMan" class="query-group-cust"></JRangeNumber>
+              </a-form-item>
+            </a-col>
+          </template>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
+              <a-col :lg="6">
+                <a-button type="primary" preIcon="ant-design:search-outlined" @click="reload">查询</a-button>
+                <a-button preIcon="ant-design:reload-outlined" @click="searchReset" style="margin-left: 8px">重置</a-button>
+                <a @click="toggleSearchStatus = !toggleSearchStatus" style="margin-left: 8px">
+                  {{ toggleSearchStatus ? '收起' : '展开' }}
+                  <Icon :icon="toggleSearchStatus ? 'ant-design:up-outlined' : 'ant-design:down-outlined'" />
+                </a>
+              </a-col>
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!--引用表格-->
+   <BasicTable @register="registerTable" :rowSelection="rowSelection">
+     <!--插槽:table标题-->
+      <template #tableTitle>
+          <a-button type="primary" v-auth="'afterCode:after_scheduling:add'"  @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
+          <a-button  type="primary" v-auth="'afterCode:after_scheduling:exportXls'"  preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
+          <!-- <j-upload-button  type="primary" v-auth="'afterCode:after_scheduling:importExcel'"  preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button> -->
+          <a-dropdown v-if="selectedRowKeys.length > 0">
+              <template #overlay>
+                <a-menu>
+                  <a-menu-item key="1" @click="batchHandleDelete">
+                    <Icon icon="ant-design:delete-outlined"></Icon>
+                    删除
+                  </a-menu-item>
+                </a-menu>
+              </template>
+              <a-button v-auth="'afterCode:after_scheduling:deleteBatch'">批量操作
+                <Icon icon="mdi:chevron-down"></Icon>
+              </a-button>
+        </a-dropdown>
+        <!-- 高级查询 -->
+        <!-- <super-query :config="superQueryConfig" @search="handleSuperQuery" /> -->
+      </template>
+       <!--操作栏-->
+      <template #action="{ record }">
+        <TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)"/>
+      </template>
+      <!--字段回显插槽-->
+      <template v-slot:bodyCell="{ column, record, index, text }">
+      </template>
+    </BasicTable>
+    <!-- 表单区域 -->
+    <AfterSchedulingModal @register="registerModal" @success="handleSuccess"></AfterSchedulingModal>
+  </div>
+</template>
+
+<script lang="ts" name="afterCode-afterScheduling" setup>
+  import {ref, reactive, computed, unref} from 'vue';
+  import {BasicTable, useTable, TableAction} from '/@/components/Table';
+  import { useListPage } from '/@/hooks/system/useListPage'
+  import {useModal} from '/@/components/Modal';
+  import AfterSchedulingModal from './components/AfterSchedulingModal.vue'
+  import {columns, superQuerySchema} from './AfterScheduling.data';
+  import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './AfterScheduling.api';
+  import {downloadFile} from '/@/utils/common/renderUtils';
+  import { cloneDeep } from "lodash-es";
+  import { useUserStore } from '/@/store/modules/user';
+  import { JDictSelectTag, JInput ,JSelect} from '/@/components/Form';
+  const formRef = ref();
+  const queryParam = reactive<any>({});
+  const checkedKeys = ref<Array<string | number>>([]);
+  //注册model
+  const [registerModal, {openModal}] = useModal();
+  const userStore = useUserStore();
+   //注册table数据
+  const { prefixCls,tableContext,onExportXls,onImportXls } = useListPage({
+      tableProps:{
+           title: '运维排班(service scheduling)',
+           api: list,
+           columns,
+           canResize:false,
+           useSearchForm: false,
+           actionColumn: {
+               width: 120,
+               fixed:'right'
+           },
+           beforeFetch: async (params) => {
+             let rangerQuery = await setRangeQuery();
+             return Object.assign(params, rangerQuery);
+           },
+        },
+        exportConfig: {
+            name:"运维排班(service scheduling)",
+            url: getExportUrl,
+            params: queryParam,
+        },
+        importConfig: {
+            url: getImportUrl,
+            success: handleSuccess
+        },
+    })
+
+  const [registerTable, {reload},{ rowSelection, selectedRowKeys }] = tableContext
+
+  // 高级查询配置
+  const superQueryConfig = reactive(superQuerySchema);
+
+  /**
+   * 高级查询事件
+   */
+  function handleSuperQuery(params) {
+    Object.keys(params).map((k) => {
+      queryParam[k] = params[k];
+    });
+    reload();
+  }
+
+   /**
+    * 新增事件
+    */
+  function handleAdd() {
+     openModal(true, {
+       isUpdate: false,
+       showFooter: true,
+     });
+  }
+   /**
+    * 编辑事件
+    */
+  function handleEdit(record: Recordable) {
+     openModal(true, {
+       record,
+       isUpdate: true,
+       showFooter: true,
+     });
+   }
+   /**
+    * 详情
+   */
+  function handleDetail(record: Recordable) {
+     openModal(true, {
+       record,
+       isUpdate: true,
+       showFooter: false,
+     });
+   }
+   /**
+    * 删除事件
+    */
+  async function handleDelete(record) {
+     await deleteOne({id: record.id}, handleSuccess);
+   }
+   /**
+    * 批量删除事件
+    */
+  async function batchHandleDelete() {
+     await batchDelete({ids: selectedRowKeys.value},handleSuccess);
+   }
+   /**
+    * 成功回调
+    */
+  function handleSuccess() {
+      (selectedRowKeys.value = []) && reload();
+   }
+   /**
+      * 操作栏
+      */
+  function getTableAction(record){
+       return [
+         {
+           label: '编辑',
+           onClick: handleEdit.bind(null, record),
+           auth: 'afterCode:after_scheduling:edit'
+         }
+       ]
+   }
+     /**
+        * 下拉操作栏
+        */
+  function getDropDownAction(record){
+       return [
+         {
+           label: '详情',
+           onClick: handleDetail.bind(null, record),
+         }, {
+           label: '删除',
+           popConfirm: {
+             title: '是否确认删除',
+             confirm: handleDelete.bind(null, record),
+             placement: 'topLeft'
+           },
+           auth: 'afterCode:after_scheduling:delete'
+         }
+       ]
+   }
+
+  
+
+  /* ----------------------以下为原生查询需要添加的-------------------------- */
+  const toggleSearchStatus = ref<boolean>(false);
+  const labelCol = reactive({
+    xs:24,
+    sm:4,
+    xl:6,
+    xxl:4
+  });
+  const wrapperCol = reactive({
+    xs: 24,
+    sm: 20,
+  });
+  /**
+   * 重置
+   */
+  function searchReset() {
+    formRef.value.resetFields();
+    selectedRowKeys.value = [];
+    //刷新数据
+    reload();
+  }
+
+  
+  let rangeField = 'billDate,schedulingDateBegin,schedulingDateEnd,'
+  
+  /**
+   * 设置范围查询条件
+   */
+  async function setRangeQuery(){
+    let queryParamClone = cloneDeep(queryParam);
+    if (rangeField) {
+      let fieldsValue = rangeField.split(',');
+      fieldsValue.forEach(item => {
+        if (queryParamClone[item]) {
+          let range = queryParamClone[item];
+          queryParamClone[item+'_begin'] = range[0];
+          queryParamClone[item+'_end'] = range[1];
+          delete queryParamClone[item];
+        } else {
+          queryParamClone[item+'_begin'] = '';
+          queryParamClone[item+'_end'] = '';
+        }
+      })
+    }
+    return queryParamClone;
+  }
+</script>
+<style lang="less" scoped>
+  .jeecg-basic-table-form-container {
+    padding: 0;
+    .table-page-search-submitButtons {
+      display: block;
+      margin-bottom: 24px;
+      white-space: nowrap;
+    }
+    .query-group-cust{
+      min-width: 100px !important;
+    }
+    .query-group-split-cust{
+      width: 30px;
+      display: inline-block;
+      text-align: center
+    }
+    .ant-form-item:not(.ant-form-item-with-help){
+      margin-bottom: 16px;
+      height: 32px;
+    }
+    :deep(.ant-picker),:deep(.ant-input-number){
+      width: 100%;
+    }
+  }
+</style>

+ 259 - 0
src/views/afterCode/AfterScheduling/components/AfterSchedulingForm.vue

@@ -0,0 +1,259 @@
+<template>
+  <a-spin :spinning="loading">
+    <JFormContainer :disabled="disabled">
+      <template #detail>
+        <a-form v-bind="formItemLayout" name="AfterSchedulingForm" ref="formRef">
+          <a-row>
+						<a-col :span="12">
+							<a-form-item label="单据日期" v-bind="validateInfos.billDate" id="AfterSchedulingForm-billDate" name="billDate">
+								<a-date-picker placeholder="请选择单据日期"  v-model:value="formData.billDate" value-format="YYYY-MM-DD"  style="width: 100%"  allow-clear />
+							</a-form-item>
+						</a-col>
+						<a-col :span="12">
+							<a-form-item label="项目" v-bind="validateInfos.project" id="AfterSchedulingForm-project" name="project">
+								<a-input v-model:value="formData.project" placeholder="请输入项目"  allow-clear ></a-input>
+							</a-form-item>
+						</a-col>
+						<a-col :span="12">
+							<a-form-item label="项目名称" v-bind="validateInfos.projectName" id="AfterSchedulingForm-projectName" name="projectName">
+								<a-input v-model:value="formData.projectName" placeholder="请输入项目名称"  allow-clear ></a-input>
+							</a-form-item>
+						</a-col>
+						<a-col :span="12">
+							<a-form-item label="其他项目" v-bind="validateInfos.otherProject" id="AfterSchedulingForm-otherProject" name="otherProject">
+								<a-input v-model:value="formData.otherProject" placeholder="请输入其他项目"  allow-clear ></a-input>
+							</a-form-item>
+						</a-col>
+						<a-col :span="12">
+							<a-form-item label="客户" v-bind="validateInfos.customer" id="AfterSchedulingForm-customer" name="customer">
+								<a-input v-model:value="formData.customer" placeholder="请输入客户"  allow-clear ></a-input>
+							</a-form-item>
+						</a-col>
+						<a-col :span="12">
+							<a-form-item label="客户名称" v-bind="validateInfos.customerName" id="AfterSchedulingForm-customerName" name="customerName">
+								<a-input v-model:value="formData.customerName" placeholder="请输入客户名称"  allow-clear ></a-input>
+							</a-form-item>
+						</a-col>
+						<a-col :span="12">
+							<a-form-item label="地点(address)" v-bind="validateInfos.address" id="AfterSchedulingForm-address" name="address">
+								<a-input v-model:value="formData.address" placeholder="请输入地点(address)"  allow-clear ></a-input>
+							</a-form-item>
+						</a-col>
+						<a-col :span="12">
+							<a-form-item label="排班日期(scheduling date)开始" v-bind="validateInfos.schedulingDateBegin" id="AfterSchedulingForm-schedulingDateBegin" name="schedulingDateBegin">
+								<a-date-picker placeholder="请选择排班日期(scheduling date)开始"  v-model:value="formData.schedulingDateBegin" value-format="YYYY-MM-DD"  style="width: 100%"  allow-clear />
+							</a-form-item>
+						</a-col>
+						<a-col :span="12">
+							<a-form-item label="排班日期(scheduling date)结束" v-bind="validateInfos.schedulingDateEnd" id="AfterSchedulingForm-schedulingDateEnd" name="schedulingDateEnd">
+								<a-date-picker placeholder="请选择排班日期(scheduling date)结束"  v-model:value="formData.schedulingDateEnd" value-format="YYYY-MM-DD"  style="width: 100%"  allow-clear />
+							</a-form-item>
+						</a-col>
+						<a-col :span="12">
+							<a-form-item label="排班人员(scheduling man)" v-bind="validateInfos.schedulingMan" id="AfterSchedulingForm-schedulingMan" name="schedulingMan">
+								<a-input v-model:value="formData.schedulingMan" placeholder="请输入排班人员(scheduling man)"  allow-clear ></a-input>
+							</a-form-item>
+						</a-col>
+						<a-col :span="12">
+							<a-form-item label="备注(notes)" v-bind="validateInfos.notes" id="AfterSchedulingForm-notes" name="notes">
+								<a-input v-model:value="formData.notes" placeholder="请输入备注(notes)"  allow-clear ></a-input>
+							</a-form-item>
+						</a-col>
+          </a-row>
+        </a-form>
+      </template>
+    </JFormContainer>
+
+		<!-- 子表单区域 -->
+    <a-tabs v-model:activeKey="activeKey" animated>
+      <a-tab-pane tab="运维排班-船明细" key="afterSchedulingShip" :forceRender="true">
+        <j-vxe-table
+          :keep-source="true"
+          resizable
+          ref="afterSchedulingShipTableRef"
+          :loading="afterSchedulingShipTable.loading"
+          :columns="afterSchedulingShipTable.columns"
+          :dataSource="afterSchedulingShipTable.dataSource"
+          :height="340"
+          :disabled="disabled"
+          :rowNumber="true"
+          :rowSelection="true"
+          :toolbar="true"/>
+      </a-tab-pane>
+    </a-tabs>
+  </a-spin>
+</template>
+
+<script lang="ts">
+  import { defineComponent, ref, reactive, computed, toRaw, onMounted } from 'vue';
+  import { defHttp } from '/@/utils/http/axios';
+  import { useValidateAntFormAndTable } from '/@/hooks/system/useJvxeMethods';
+  import { queryAfterSchedulingShipListByMainId, queryDataById, saveOrUpdate } from '../AfterScheduling.api';
+  import { JVxeTable } from '/@/components/jeecg/JVxeTable';
+  import {afterSchedulingShipColumns} from '../AfterScheduling.data';
+  import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';
+  import { Form } from 'ant-design-vue';
+  const useForm = Form.useForm;
+
+  export default defineComponent({
+    name: "AfterSchedulingForm",
+    components:{
+      JVxeTable,
+			JFormContainer,
+    },
+    props:{
+      formDisabled:{
+        type: Boolean,
+        default: false
+      },
+      formData: { type: Object, default: ()=>{} },
+      formBpm: { type: Boolean, default: true }
+    },
+    emits:['success'],
+    setup(props, {emit}) {
+      const loading = ref(false);
+      const formRef = ref();
+      const afterSchedulingShipTableRef = ref();
+      const afterSchedulingShipTable = reactive<Record<string, any>>({
+        loading: false,
+        columns: afterSchedulingShipColumns,
+        dataSource: []
+      });
+      const activeKey = ref('afterSchedulingShip');
+      const formData = reactive<Record<string, any>>({
+        id: '',
+        delFlag: undefined,
+        billDate: '',   
+        project: '',   
+        projectName: '',   
+        otherProject: '',   
+        customer: '',   
+        customerName: '',   
+        address: '',   
+        schedulingDateBegin: '',   
+        schedulingDateEnd: '',   
+        schedulingMan: '',   
+        notes: '',   
+      });
+
+      //表单验证
+      const validatorRules = reactive({
+      });
+      const {resetFields, validate, validateInfos} = useForm(formData, validatorRules, {immediate: false});
+      const dbData = {};
+      const formItemLayout = {
+        labelCol: {xs: {span: 24}, sm: {span: 5}},
+        wrapperCol: {xs: {span: 24}, sm: {span: 16}},
+      };
+
+      // 表单禁用
+      const disabled = computed(()=>{
+        if(props.formBpm === true){
+          if(props.formData.disabled === false){
+            return false;
+          }else{
+            return true;
+          }
+        }
+        return props.formDisabled;
+      });
+
+      
+
+      function add() {
+        resetFields();
+        afterSchedulingShipTable.dataSource = [];
+      }
+
+      async function edit(row) {
+        //主表数据
+        await queryMainData(row.id);
+        //子表数据
+        const afterSchedulingShipDataList = await queryAfterSchedulingShipListByMainId(row['id']);
+        afterSchedulingShipTable.dataSource = [...afterSchedulingShipDataList];
+      }
+
+      async function queryMainData(id) {
+        const row = await queryDataById(id);
+        resetFields();
+        const tmpData = {};
+        Object.keys(formData).forEach((key) => {
+          if(row.hasOwnProperty(key)){
+            tmpData[key] = row[key]
+          }
+        })
+        //赋值
+        Object.assign(formData,tmpData);
+      }
+
+      const {getSubFormAndTableData, transformData} = useValidateAntFormAndTable(activeKey, {
+        'afterSchedulingShip': afterSchedulingShipTableRef,
+      });
+
+      async function getFormData() {
+        try {
+          // 触发表单验证
+          await validate();
+        } catch ({ errorFields }) {
+          if (errorFields) {
+            const firstField = errorFields[0];
+            if (firstField) {
+              formRef.value.scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });
+            }
+          }
+          return Promise.reject(errorFields);
+        }
+        return transformData(toRaw(formData))
+      }
+
+      async function submitForm() {
+        const mainData = await getFormData();
+        const subData = await getSubFormAndTableData();
+        const values = Object.assign({}, dbData, mainData, subData);
+        console.log('表单提交数据', values)
+        const isUpdate = values.id ? true : false
+        await saveOrUpdate(values, isUpdate);
+        //关闭弹窗
+        emit('success');
+      }
+      
+      function setFieldsValue(values) {
+        if(values){
+          Object.keys(values).map(k=>{
+            formData[k] = values[k];
+          });
+        }
+      }
+
+      /**
+       * 值改变事件触发-树控件回调
+       * @param key
+       * @param value
+       */
+      function handleFormChange(key, value) {
+        formData[key] = value;
+      }
+
+
+      return {
+        afterSchedulingShipTableRef,
+        afterSchedulingShipTable,
+        validatorRules,
+        validateInfos,
+        activeKey,
+        loading,
+        formData,
+        setFieldsValue,
+        handleFormChange,
+        formItemLayout,
+        disabled,
+        getFormData,
+        submitForm,
+        add,
+        edit,
+        formRef,
+      }
+    }
+  });
+</script>
+<style lang="less" scoped></style>

+ 67 - 0
src/views/afterCode/AfterScheduling/components/AfterSchedulingModal.vue

@@ -0,0 +1,67 @@
+<template>
+  <BasicModal v-bind="$attrs" @register="registerModal" :title="title" width="95%" @ok="handleSubmit">
+    <after-scheduling-form ref="formComponent" :formDisabled="formDisabled" :formBpm="false" @success="submitSuccess"></after-scheduling-form>
+  </BasicModal>
+</template>
+
+<script lang="ts">
+  import { ref, unref } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import AfterSchedulingForm from './AfterSchedulingForm.vue';
+
+  export default {
+    name: "TestCgMainVxeModal",
+    components:{
+      BasicModal,
+      AfterSchedulingForm
+    },
+    emits:['register','success'],
+    setup(_p, {emit}){
+      const formComponent = ref()
+      const isUpdate = ref(true);
+      const formDisabled = ref(false);
+      const title = ref('')
+
+      //表单赋值
+      const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {
+        setModalProps({confirmLoading: false,showCancelBtn:data?.showFooter,showOkBtn:data?.showFooter});
+        isUpdate.value = !!data?.isUpdate;
+        formDisabled.value = !data?.showFooter;
+        title.value = data?.isUpdate ? (unref(formDisabled) ? '详情' : '编辑') : '新增';
+        if (unref(isUpdate)) {
+          formComponent.value.edit(data.record)
+        }else{
+          formComponent.value.add()
+        }
+      });
+
+      function handleSubmit() {
+        formComponent.value.submitForm();
+      }
+
+      function submitSuccess(){
+        emit('success');
+        closeModal();
+      }
+
+      return {
+        registerModal,
+        title,
+        formComponent,
+        formDisabled,
+        handleSubmit,
+        submitSuccess
+      }
+    }
+  }
+</script>
+<style lang="less" scoped>
+	/** 时间和数字输入框样式 */
+  :deep(.ant-input-number) {
+    width: 100%;
+  }
+
+  :deep(.ant-calendar-picker) {
+    width: 100%;
+  }
+</style>

+ 81 - 0
src/views/afterCode/AfterServiceLogs/AfterServiceLogs.api.ts

@@ -0,0 +1,81 @@
+import {defHttp} from '/@/utils/http/axios';
+import { useMessage } from "/@/hooks/web/useMessage";
+
+const { createConfirm } = useMessage();
+
+enum Api {
+  list = '/afterCode/afterServiceLogs/list',
+  save='/afterCode/afterServiceLogs/add',
+  edit='/afterCode/afterServiceLogs/edit',
+  deleteOne = '/afterCode/afterServiceLogs/delete',
+  deleteBatch = '/afterCode/afterServiceLogs/deleteBatch',
+  importExcel = '/afterCode/afterServiceLogs/importExcel',
+  exportXls = '/afterCode/afterServiceLogs/exportXls',
+  queryDataById = '/afterCode/afterServiceLogs/queryById',
+  afterServiceLogsDetailsList = '/afterCode/afterServiceLogs/queryAfterServiceLogsDetailsByMainId',
+}
+/**
+ * 导出api
+ * @param params
+ */
+export const getExportUrl = Api.exportXls;
+
+/**
+ * 导入api
+ */
+export const getImportUrl = Api.importExcel;
+
+/**
+ * 查询子表数据
+ * @param params
+ */
+export const queryAfterServiceLogsDetailsListByMainId = (id) => defHttp.get({url: Api.afterServiceLogsDetailsList, params:{ id }});
+
+/**
+ * 列表接口
+ * @param params
+ */
+export const list = (params) =>
+  defHttp.get({url: Api.list, params});
+
+/**
+ * 删除单个
+ */
+export const deleteOne = (params,handleSuccess) => {
+  return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {
+    handleSuccess();
+  });
+}
+/**
+ * 批量删除
+ * @param params
+ */
+export const batchDelete = (params, handleSuccess) => {
+  createConfirm({
+    iconType: 'warning',
+    title: '确认删除',
+    content: '是否删除选中数据',
+    okText: '确认',
+    cancelText: '取消',
+    onOk: () => {
+      return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {
+        handleSuccess();
+      });
+    }
+  });
+}
+/**
+ * 保存或者更新
+ * @param params
+ */
+export const saveOrUpdate = (params, isUpdate) => {
+  let url = isUpdate ? Api.edit : Api.save;
+  return defHttp.post({url: url, params});
+}
+
+/**
+* 根据id查询数据
+* @param params
+*/
+export const queryDataById = (id) => defHttp.get({url: Api.queryDataById, params:{ id }});
+

+ 580 - 0
src/views/afterCode/AfterServiceLogs/AfterServiceLogs.data.ts

@@ -0,0 +1,580 @@
+import {BasicColumn} from '/@/components/Table';
+import {FormSchema} from '/@/components/Table';
+import { rules} from '/@/utils/helper/validator';
+import { render } from '/@/utils/common/renderUtils';
+import {JVxeTypes,JVxeColumn} from '/@/components/jeecg/JVxeTable/types'
+import { getWeekMonthQuarterYear } from '/@/utils';
+//列表数据
+export const columns: BasicColumn[] = [
+   {
+    title: '提交(submit)',
+    align:"center",
+    dataIndex: 'submit_dictText'
+   },
+   {
+    title: '单据日期',
+    align:"center",
+    dataIndex: 'billDate',
+    customRender:({text}) =>{
+      text = !text ? "" : (text.length > 10 ? text.substr(0,10) : text);
+      return text;
+    },
+   },
+   {
+    title: '项目主管',
+    align:"center",
+    dataIndex: 'projectManager'
+   },
+  
+   {
+    title: '项目名称',
+    align:"center",
+    dataIndex: 'projectName'
+   },
+   {
+    title: '其他项目',
+    align:"center",
+    dataIndex: 'otherProject'
+   },
+   
+   {
+    title: '客户名称',
+    align:"center",
+    dataIndex: 'customerName'
+   },
+   {
+    title: '地点(address)',
+    align:"center",
+    dataIndex: 'address'
+   },
+   {
+    title: '排班日期(scheduling date)',
+    align:"center",
+    dataIndex: 'schedulingDateBegin',
+    customRender:({text}) =>{
+      text = !text ? "" : (text.length > 10 ? text.substr(0,10) : text);
+      return text;
+    },
+   },
+   {
+    title: '排班人员(scheduling man)',
+    align:"center",
+    dataIndex: 'schedulingMan'
+   },
+   {
+    title: '运维日志(maintenance log)',
+    align:"center",
+    dataIndex: 'maintenanceLog'
+   },
+   {
+    title: '附件(attsch)',
+    align:"center",
+    dataIndex: 'attsch',
+   },
+];
+
+//子表表格配置
+export const afterServiceLogsDetailsColumns: JVxeColumn[] = [
+    {
+      title: '运维日期(scheduling date)',
+      key: 'schedulingDate',
+      type: JVxeTypes.date,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '备注(notes)',
+      key: 'notes',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '7-8点工作内容',
+      key: 'time78Work',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '7-8点工作重要程度',
+      key: 'time78Degree',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '7-8点工作备注',
+      key: 'time78Notes',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '8-9点工作内容',
+      key: 'time89Work',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '8-9点工作重要程度',
+      key: 'time89Degree',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '8-9点工作备注',
+      key: 'time89Notes',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '9-10点工作内容',
+      key: 'time910Work',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '9-10点工作重要程度',
+      key: 'time910Degree',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '9-10点工作备注',
+      key: 'time910Notes',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '10-11点工作内容',
+      key: 'time1011Work',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '10-11点工作重要程度',
+      key: 'time1011Degree',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '10-11点工作备注',
+      key: 'time1011Notes',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '11-12点工作内容',
+      key: 'time1112Work',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '11-12点工作重要程度',
+      key: 'time1112Degree',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '11-12点工作备注',
+      key: 'time1112Notes',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '12-13点工作内容',
+      key: 'time1213Work',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '12-13点工作重要程度',
+      key: 'time1213Degree',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '12-13点工作备注',
+      key: 'time1213Notes',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '13-14点工作内容',
+      key: 'time1314Work',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '13-14点工作重要程度',
+      key: 'time1314Degree',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '13-14点工作备注',
+      key: 'time1314Notes',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '14-15点工作内容',
+      key: 'time1415Work',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '14-15点工作重要程度',
+      key: 'time1415Degree',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '14-15点工作备注',
+      key: 'time1415Notes',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '15-16点工作内容',
+      key: 'time1516Work',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '15-16点工作重要程度',
+      key: 'time1516Degree',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '15-16点工作备注',
+      key: 'time1516Notes',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '16-17点工作内容',
+      key: 'time1617Work',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '16-17点工作重要程度',
+      key: 'time1617Degree',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '16-17点工作备注',
+      key: 'time1617Notes',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '17-18点工作内容',
+      key: 'time1718Work',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '17-18点工作重要程度',
+      key: 'time1718Degree',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '17-18点工作备注',
+      key: 'time1718Notes',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '18-19点工作内容',
+      key: 'time1819Work',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '18-19点工作重要程度',
+      key: 'time1819Degree',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '18-19点工作备注',
+      key: 'time1819Notes',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '19-20点工作内容',
+      key: 'time1920Work',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '19-20点工作重要程度',
+      key: 'time1920Degree',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '19-20点工作备注',
+      key: 'time1920Notes',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '20-21点工作内容',
+      key: 'time2021Work',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '20-21点工作重要程度',
+      key: 'time2021Degree',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '20-21点工作备注',
+      key: 'time2021Notes',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '21-22点工作内容',
+      key: 'time2122Work',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '21-22点工作重要程度',
+      key: 'time2122Degree',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '21-22点工作备注',
+      key: 'time2122Notes',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '22-23点工作内容',
+      key: 'time2223Work',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '22-23点工作重要程度',
+      key: 'time2223Degree',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '22-23点工作备注',
+      key: 'time2223Notes',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '23-24点工作内容',
+      key: 'time2324Work',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '23-24点工作重要程度',
+      key: 'time2324Degree',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+    {
+      title: '23-24点工作备注',
+      key: 'time2324Notes',
+      type: JVxeTypes.input,
+      width:"200px",
+      placeholder: '请输入${title}',
+      defaultValue:'',
+    },
+  ]
+
+// 高级查询数据
+export const superQuerySchema = {
+  submit: {title: '提交(submit)1是0否',order: 0,view: 'number', type: 'number',},
+  billDate: {title: '单据日期',order: 1,view: 'date', type: 'string',},
+  projectManager: {title: '项目主管',order: 2,view: 'text', type: 'string',},
+  project: {title: '项目',order: 3,view: 'text', type: 'string',},
+  projectName: {title: '项目名称',order: 4,view: 'text', type: 'string',},
+  otherProject: {title: '其他项目',order: 5,view: 'text', type: 'string',},
+  customer: {title: '客户',order: 6,view: 'text', type: 'string',},
+  customerName: {title: '客户名称',order: 7,view: 'text', type: 'string',},
+  address: {title: '地点(address)',order: 8,view: 'text', type: 'string',},
+  schedulingDateBegin: {title: '排班日期(scheduling date)开始',order: 9,view: 'date', type: 'string',},
+  schedulingDateEnd: {title: '排班日期(scheduling date)结束',order: 10,view: 'date', type: 'string',},
+  schedulingMan: {title: '排班人员(scheduling man)',order: 11,view: 'text', type: 'string',},
+  maintenanceLog: {title: '运维日志(maintenance log)',order: 12,view: 'text', type: 'string',},
+  attsch: {title: '附件(attsch)',order: 13,view: 'file', type: 'string',},
+  //子表高级查询
+  afterServiceLogsDetails: {
+    title: '运维日志-明细',
+    view: 'table',
+    fields: {
+        schedulingDate: {title: '运维日期(scheduling date)',order: 0,view: 'date', type: 'string',},
+        notes: {title: '备注(notes)',order: 1,view: 'text', type: 'string',},
+        time78Work: {title: '7-8点工作内容',order: 2,view: 'text', type: 'string',},
+        time78Degree: {title: '7-8点工作重要程度',order: 3,view: 'text', type: 'string',},
+        time78Notes: {title: '7-8点工作备注',order: 4,view: 'text', type: 'string',},
+        time89Work: {title: '8-9点工作内容',order: 5,view: 'text', type: 'string',},
+        time89Degree: {title: '8-9点工作重要程度',order: 6,view: 'text', type: 'string',},
+        time89Notes: {title: '8-9点工作备注',order: 7,view: 'text', type: 'string',},
+        time910Work: {title: '9-10点工作内容',order: 8,view: 'text', type: 'string',},
+        time910Degree: {title: '9-10点工作重要程度',order: 9,view: 'text', type: 'string',},
+        time910Notes: {title: '9-10点工作备注',order: 10,view: 'text', type: 'string',},
+        time1011Work: {title: '10-11点工作内容',order: 11,view: 'text', type: 'string',},
+        time1011Degree: {title: '10-11点工作重要程度',order: 12,view: 'text', type: 'string',},
+        time1011Notes: {title: '10-11点工作备注',order: 13,view: 'text', type: 'string',},
+        time1112Work: {title: '11-12点工作内容',order: 14,view: 'text', type: 'string',},
+        time1112Degree: {title: '11-12点工作重要程度',order: 15,view: 'text', type: 'string',},
+        time1112Notes: {title: '11-12点工作备注',order: 16,view: 'text', type: 'string',},
+        time1213Work: {title: '12-13点工作内容',order: 17,view: 'text', type: 'string',},
+        time1213Degree: {title: '12-13点工作重要程度',order: 18,view: 'text', type: 'string',},
+        time1213Notes: {title: '12-13点工作备注',order: 19,view: 'text', type: 'string',},
+        time1314Work: {title: '13-14点工作内容',order: 20,view: 'text', type: 'string',},
+        time1314Degree: {title: '13-14点工作重要程度',order: 21,view: 'text', type: 'string',},
+        time1314Notes: {title: '13-14点工作备注',order: 22,view: 'text', type: 'string',},
+        time1415Work: {title: '14-15点工作内容',order: 23,view: 'text', type: 'string',},
+        time1415Degree: {title: '14-15点工作重要程度',order: 24,view: 'text', type: 'string',},
+        time1415Notes: {title: '14-15点工作备注',order: 25,view: 'text', type: 'string',},
+        time1516Work: {title: '15-16点工作内容',order: 26,view: 'text', type: 'string',},
+        time1516Degree: {title: '15-16点工作重要程度',order: 27,view: 'text', type: 'string',},
+        time1516Notes: {title: '15-16点工作备注',order: 28,view: 'text', type: 'string',},
+        time1617Work: {title: '16-17点工作内容',order: 29,view: 'text', type: 'string',},
+        time1617Degree: {title: '16-17点工作重要程度',order: 30,view: 'text', type: 'string',},
+        time1617Notes: {title: '16-17点工作备注',order: 31,view: 'text', type: 'string',},
+        time1718Work: {title: '17-18点工作内容',order: 32,view: 'text', type: 'string',},
+        time1718Degree: {title: '17-18点工作重要程度',order: 33,view: 'text', type: 'string',},
+        time1718Notes: {title: '17-18点工作备注',order: 34,view: 'text', type: 'string',},
+        time1819Work: {title: '18-19点工作内容',order: 35,view: 'text', type: 'string',},
+        time1819Degree: {title: '18-19点工作重要程度',order: 36,view: 'text', type: 'string',},
+        time1819Notes: {title: '18-19点工作备注',order: 37,view: 'text', type: 'string',},
+        time1920Work: {title: '19-20点工作内容',order: 38,view: 'text', type: 'string',},
+        time1920Degree: {title: '19-20点工作重要程度',order: 39,view: 'text', type: 'string',},
+        time1920Notes: {title: '19-20点工作备注',order: 40,view: 'text', type: 'string',},
+        time2021Work: {title: '20-21点工作内容',order: 41,view: 'text', type: 'string',},
+        time2021Degree: {title: '20-21点工作重要程度',order: 42,view: 'text', type: 'string',},
+        time2021Notes: {title: '20-21点工作备注',order: 43,view: 'text', type: 'string',},
+        time2122Work: {title: '21-22点工作内容',order: 44,view: 'text', type: 'string',},
+        time2122Degree: {title: '21-22点工作重要程度',order: 45,view: 'text', type: 'string',},
+        time2122Notes: {title: '21-22点工作备注',order: 46,view: 'text', type: 'string',},
+        time2223Work: {title: '22-23点工作内容',order: 47,view: 'text', type: 'string',},
+        time2223Degree: {title: '22-23点工作重要程度',order: 48,view: 'text', type: 'string',},
+        time2223Notes: {title: '22-23点工作备注',order: 49,view: 'text', type: 'string',},
+        time2324Work: {title: '23-24点工作内容',order: 50,view: 'text', type: 'string',},
+        time2324Degree: {title: '23-24点工作重要程度',order: 51,view: 'text', type: 'string',},
+        time2324Notes: {title: '23-24点工作备注',order: 52,view: 'text', type: 'string',},
+    }
+  },
+};

+ 334 - 0
src/views/afterCode/AfterServiceLogs/AfterServiceLogsList.vue

@@ -0,0 +1,334 @@
+<template>
+  <div class="p-2">
+    <!--查询区域-->
+    <div class="jeecg-basic-table-form-container">
+      <a-form ref="formRef" @keyup.enter.native="reload" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
+        <a-row :gutter="24">
+         
+          <a-col :lg="8">
+            <a-form-item name="billDate">
+              <template #label><span title="单据日期">单据日期</span></template>
+              <a-range-picker value-format="YYYY-MM-DD"  v-model:value="queryParam.billDate" class="query-group-cust"/>
+            </a-form-item>
+          </a-col>
+            <a-col :lg="8">
+              <a-form-item name="projectManager">
+                <template #label><span title="项目主管">项目主管</span></template>
+                <a-input placeholder="请输入项目主管" v-model:value="queryParam.projectManager" allow-clear ></a-input>
+              </a-form-item>
+            </a-col>
+          <template v-if="toggleSearchStatus">
+            <a-col :lg="8">
+              <a-form-item name="projectName">
+                <template #label><span title="项目名称">项目名称</span></template>
+                <a-input placeholder="请输入项目名称" v-model:value="queryParam.projectName" allow-clear ></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :lg="8">
+              <a-form-item name="otherProject">
+                <template #label><span title="其他项目">其他项目</span></template>
+                <a-input placeholder="请输入其他项目" v-model:value="queryParam.otherProject" allow-clear ></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :lg="8">
+              <a-form-item name="customerName">
+                <template #label><span title="客户名称">客户名称</span></template>
+                <a-input placeholder="请输入客户名称" v-model:value="queryParam.customerName" allow-clear ></a-input>
+              </a-form-item>
+            </a-col>
+			
+			<a-col :lg="8">
+			  <a-form-item name="submit" >
+			    <template #label><span title="提交(submit)">提交(submit)</span></template>
+			    <JDictSelectTag v-model:value="queryParam.submit" placeholder="请选择" dictCode="yes_or_no"  />
+			  </a-form-item>
+			</a-col>
+            <a-col :lg="8">
+              <a-form-item name="schedulingDateBegin">
+                <template #label><span title="排班日期(scheduling date)开始">排班日期</span></template>
+                <a-range-picker value-format="YYYY-MM-DD"  v-model:value="queryParam.schedulingDateBegin" class="query-group-cust"/>
+              </a-form-item>
+            </a-col>
+            <a-col :lg="8">
+              <a-form-item name="schedulingDateEnd">
+                <template #label><span title="排班日期(scheduling date)结束">排班日期</span></template>
+                <a-range-picker value-format="YYYY-MM-DD"  v-model:value="queryParam.schedulingDateEnd" class="query-group-cust"/>
+              </a-form-item>
+            </a-col>
+            <a-col :lg="8">
+              <a-form-item name="schedulingMan">
+                <template #label><span title="排班人员(scheduling man)">排班人员</span></template>
+                <a-input placeholder="请输入排班人员(scheduling man)" v-model:value="queryParam.schedulingMan" allow-clear ></a-input>
+              </a-form-item>
+            </a-col>
+          </template>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
+              <a-col :lg="6">
+                <a-button type="primary" preIcon="ant-design:search-outlined" @click="reload">查询</a-button>
+                <a-button preIcon="ant-design:reload-outlined" @click="searchReset" style="margin-left: 8px">重置</a-button>
+                <a @click="toggleSearchStatus = !toggleSearchStatus" style="margin-left: 8px">
+                  {{ toggleSearchStatus ? '收起' : '展开' }}
+                  <Icon :icon="toggleSearchStatus ? 'ant-design:up-outlined' : 'ant-design:down-outlined'" />
+                </a>
+              </a-col>
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!--引用表格-->
+   <BasicTable @register="registerTable" :rowSelection="rowSelection">
+     <!--插槽:table标题-->
+      <template #tableTitle>
+          <a-button type="primary" v-auth="'afterCode:after_service_logs:add'"  @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
+          <a-button  type="primary" v-auth="'afterCode:after_service_logs:exportXls'"  preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
+          <!-- <j-upload-button  type="primary" v-auth="'afterCode:after_service_logs:importExcel'"  preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button> -->
+          <a-dropdown v-if="selectedRowKeys.length > 0">
+              <template #overlay>
+                <a-menu>
+                  <a-menu-item key="1" @click="batchHandleDelete">
+                    <Icon icon="ant-design:delete-outlined"></Icon>
+                    删除
+                  </a-menu-item>
+                </a-menu>
+              </template>
+              <a-button v-auth="'afterCode:after_service_logs:deleteBatch'">批量操作
+                <Icon icon="mdi:chevron-down"></Icon>
+              </a-button>
+        </a-dropdown>
+        <!-- 高级查询 -->
+        <!-- <super-query :config="superQueryConfig" @search="handleSuperQuery" /> -->
+      </template>
+       <!--操作栏-->
+      <template #action="{ record }">
+        <TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)"/>
+      </template>
+      <!--字段回显插槽-->
+      <template v-slot:bodyCell="{ column, record, index, text }">
+        <template v-if="column.dataIndex==='attsch'">
+          <!--文件字段回显插槽-->
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
+          <a-button v-else :ghost="true" type="primary" preIcon="ant-design:download-outlined" size="small" @click="downloadFile(text)">下载</a-button>
+        </template>
+      </template>
+    </BasicTable>
+    <!-- 表单区域 -->
+    <AfterServiceLogsModal @register="registerModal" @success="handleSuccess"></AfterServiceLogsModal>
+  </div>
+</template>
+
+<script lang="ts" name="afterCode-afterServiceLogs" setup>
+  import {ref, reactive, computed, unref} from 'vue';
+  import {BasicTable, useTable, TableAction} from '/@/components/Table';
+  import { useListPage } from '/@/hooks/system/useListPage'
+  import {useModal} from '/@/components/Modal';
+  import AfterServiceLogsModal from './components/AfterServiceLogsModal.vue'
+  import {columns, superQuerySchema} from './AfterServiceLogs.data';
+  import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './AfterServiceLogs.api';
+  import {downloadFile} from '/@/utils/common/renderUtils';
+  import { cloneDeep } from "lodash-es";
+  import { JDictSelectTag, JInput ,JSelect} from '/@/components/Form';
+  import { useUserStore } from '/@/store/modules/user';
+  const formRef = ref();
+  const queryParam = reactive<any>({});
+  const checkedKeys = ref<Array<string | number>>([]);
+  //注册model
+  const [registerModal, {openModal}] = useModal();
+  const userStore = useUserStore();
+   //注册table数据
+  const { prefixCls,tableContext,onExportXls,onImportXls } = useListPage({
+      tableProps:{
+           title: '运维日志(service logs)',
+           api: list,
+           columns,
+           canResize:false,
+           useSearchForm: false,
+           actionColumn: {
+               width: 120,
+               fixed:'right'
+           },
+           beforeFetch: async (params) => {
+             let rangerQuery = await setRangeQuery();
+             return Object.assign(params, rangerQuery);
+           },
+        },
+        exportConfig: {
+            name:"运维日志(service logs)",
+            url: getExportUrl,
+            params: queryParam,
+        },
+        importConfig: {
+            url: getImportUrl,
+            success: handleSuccess
+        },
+    })
+
+  const [registerTable, {reload},{ rowSelection, selectedRowKeys }] = tableContext
+
+  // 高级查询配置
+  const superQueryConfig = reactive(superQuerySchema);
+
+  /**
+   * 高级查询事件
+   */
+  function handleSuperQuery(params) {
+    Object.keys(params).map((k) => {
+      queryParam[k] = params[k];
+    });
+    reload();
+  }
+
+   /**
+    * 新增事件
+    */
+  function handleAdd() {
+     openModal(true, {
+       isUpdate: false,
+       showFooter: true,
+     });
+  }
+   /**
+    * 编辑事件
+    */
+  function handleEdit(record: Recordable) {
+     openModal(true, {
+       record,
+       isUpdate: true,
+       showFooter: true,
+     });
+   }
+   /**
+    * 详情
+   */
+  function handleDetail(record: Recordable) {
+     openModal(true, {
+       record,
+       isUpdate: true,
+       showFooter: false,
+     });
+   }
+   /**
+    * 删除事件
+    */
+  async function handleDelete(record) {
+     await deleteOne({id: record.id}, handleSuccess);
+   }
+   /**
+    * 批量删除事件
+    */
+  async function batchHandleDelete() {
+     await batchDelete({ids: selectedRowKeys.value},handleSuccess);
+   }
+   /**
+    * 成功回调
+    */
+  function handleSuccess() {
+      (selectedRowKeys.value = []) && reload();
+   }
+   /**
+      * 操作栏
+      */
+  function getTableAction(record){
+       return [
+         {
+           label: '编辑',
+           onClick: handleEdit.bind(null, record),
+           auth: 'afterCode:after_service_logs:edit'
+         }
+       ]
+   }
+     /**
+        * 下拉操作栏
+        */
+  function getDropDownAction(record){
+       return [
+         {
+           label: '详情',
+           onClick: handleDetail.bind(null, record),
+         }, {
+           label: '删除',
+           popConfirm: {
+             title: '是否确认删除',
+             confirm: handleDelete.bind(null, record),
+             placement: 'topLeft'
+           },
+           auth: 'afterCode:after_service_logs:delete'
+         }
+       ]
+   }
+
+  
+
+  /* ----------------------以下为原生查询需要添加的-------------------------- */
+  const toggleSearchStatus = ref<boolean>(false);
+  const labelCol = reactive({
+    xs:24,
+    sm:4,
+    xl:6,
+    xxl:4
+  });
+  const wrapperCol = reactive({
+    xs: 24,
+    sm: 20,
+  });
+  /**
+   * 重置
+   */
+  function searchReset() {
+    formRef.value.resetFields();
+    selectedRowKeys.value = [];
+    //刷新数据
+    reload();
+  }
+
+  
+  let rangeField = 'billDate,schedulingDateBegin,schedulingDateEnd,'
+  
+  /**
+   * 设置范围查询条件
+   */
+  async function setRangeQuery(){
+    let queryParamClone = cloneDeep(queryParam);
+    if (rangeField) {
+      let fieldsValue = rangeField.split(',');
+      fieldsValue.forEach(item => {
+        if (queryParamClone[item]) {
+          let range = queryParamClone[item];
+          queryParamClone[item+'_begin'] = range[0];
+          queryParamClone[item+'_end'] = range[1];
+          delete queryParamClone[item];
+        } else {
+          queryParamClone[item+'_begin'] = '';
+          queryParamClone[item+'_end'] = '';
+        }
+      })
+    }
+    return queryParamClone;
+  }
+</script>
+<style lang="less" scoped>
+  .jeecg-basic-table-form-container {
+    padding: 0;
+    .table-page-search-submitButtons {
+      display: block;
+      margin-bottom: 24px;
+      white-space: nowrap;
+    }
+    .query-group-cust{
+      min-width: 100px !important;
+    }
+    .query-group-split-cust{
+      width: 30px;
+      display: inline-block;
+      text-align: center
+    }
+    .ant-form-item:not(.ant-form-item-with-help){
+      margin-bottom: 16px;
+      height: 32px;
+    }
+    :deep(.ant-picker),:deep(.ant-input-number){
+      width: 100%;
+    }
+  }
+</style>

+ 272 - 0
src/views/afterCode/AfterServiceLogs/components/AfterServiceLogsForm.vue

@@ -0,0 +1,272 @@
+<template>
+  <a-spin :spinning="loading">
+    <JFormContainer :disabled="disabled">
+      <template #detail>
+        <a-form v-bind="formItemLayout" name="AfterServiceLogsForm" ref="formRef">
+          <a-row>
+						<a-col :span="12">
+							<a-form-item label="单据日期" v-bind="validateInfos.billDate" id="AfterServiceLogsForm-billDate" name="billDate">
+								<a-date-picker placeholder="请选择单据日期"  v-model:value="formData.billDate" value-format="YYYY-MM-DD"  style="width: 100%"  allow-clear />
+							</a-form-item>
+						</a-col>
+						<a-col :span="12">
+							<a-form-item label="项目主管" v-bind="validateInfos.projectManager" id="AfterServiceLogsForm-projectManager" name="projectManager">
+								<a-input v-model:value="formData.projectManager" placeholder="请输入项目主管"  allow-clear ></a-input>
+							</a-form-item>
+						</a-col>
+						<a-col :span="12">
+							<a-form-item label="项目" v-bind="validateInfos.project" id="AfterServiceLogsForm-project" name="project">
+								<a-input v-model:value="formData.project" placeholder="请输入项目"  allow-clear ></a-input>
+							</a-form-item>
+						</a-col>
+						<a-col :span="12">
+							<a-form-item label="项目名称" v-bind="validateInfos.projectName" id="AfterServiceLogsForm-projectName" name="projectName">
+								<a-input v-model:value="formData.projectName" placeholder="请输入项目名称"  allow-clear ></a-input>
+							</a-form-item>
+						</a-col>
+						<a-col :span="12">
+							<a-form-item label="其他项目" v-bind="validateInfos.otherProject" id="AfterServiceLogsForm-otherProject" name="otherProject">
+								<a-input v-model:value="formData.otherProject" placeholder="请输入其他项目"  allow-clear ></a-input>
+							</a-form-item>
+						</a-col>
+						<a-col :span="12">
+							<a-form-item label="客户" v-bind="validateInfos.customer" id="AfterServiceLogsForm-customer" name="customer">
+								<a-input v-model:value="formData.customer" placeholder="请输入客户"  allow-clear ></a-input>
+							</a-form-item>
+						</a-col>
+						<a-col :span="12">
+							<a-form-item label="客户名称" v-bind="validateInfos.customerName" id="AfterServiceLogsForm-customerName" name="customerName">
+								<a-input v-model:value="formData.customerName" placeholder="请输入客户名称"  allow-clear ></a-input>
+							</a-form-item>
+						</a-col>
+						<a-col :span="12">
+							<a-form-item label="地点(address)" v-bind="validateInfos.address" id="AfterServiceLogsForm-address" name="address">
+								<a-input v-model:value="formData.address" placeholder="请输入地点(address)"  allow-clear ></a-input>
+							</a-form-item>
+						</a-col>
+						<a-col :span="12">
+							<a-form-item label="排班日期(scheduling date)开始" v-bind="validateInfos.schedulingDateBegin" id="AfterServiceLogsForm-schedulingDateBegin" name="schedulingDateBegin">
+								<a-date-picker placeholder="请选择排班日期(scheduling date)开始"  v-model:value="formData.schedulingDateBegin" value-format="YYYY-MM-DD"  style="width: 100%"  allow-clear />
+							</a-form-item>
+						</a-col>
+						<a-col :span="12">
+							<a-form-item label="排班日期(scheduling date)结束" v-bind="validateInfos.schedulingDateEnd" id="AfterServiceLogsForm-schedulingDateEnd" name="schedulingDateEnd">
+								<a-date-picker placeholder="请选择排班日期(scheduling date)结束"  v-model:value="formData.schedulingDateEnd" value-format="YYYY-MM-DD"  style="width: 100%"  allow-clear />
+							</a-form-item>
+						</a-col>
+						<a-col :span="12">
+							<a-form-item label="排班人员(scheduling man)" v-bind="validateInfos.schedulingMan" id="AfterServiceLogsForm-schedulingMan" name="schedulingMan">
+								<a-input v-model:value="formData.schedulingMan" placeholder="请输入排班人员(scheduling man)"  allow-clear ></a-input>
+							</a-form-item>
+						</a-col>
+						<a-col :span="12">
+							<a-form-item label="运维日志(maintenance log)" v-bind="validateInfos.maintenanceLog" id="AfterServiceLogsForm-maintenanceLog" name="maintenanceLog">
+								<a-input v-model:value="formData.maintenanceLog" placeholder="请输入运维日志(maintenance log)"  allow-clear ></a-input>
+							</a-form-item>
+						</a-col>
+						<a-col :span="12">
+							<a-form-item label="附件(attsch)" v-bind="validateInfos.attsch" id="AfterServiceLogsForm-attsch" name="attsch">
+								<j-upload v-model:value="formData.attsch"   ></j-upload>
+							</a-form-item>
+						</a-col>
+          </a-row>
+        </a-form>
+      </template>
+    </JFormContainer>
+
+		<!-- 子表单区域 -->
+    <a-tabs v-model:activeKey="activeKey" animated>
+      <a-tab-pane tab="运维日志-明细" key="afterServiceLogsDetails" :forceRender="true">
+        <j-vxe-table
+          :keep-source="true"
+          resizable
+          ref="afterServiceLogsDetailsTableRef"
+          :loading="afterServiceLogsDetailsTable.loading"
+          :columns="afterServiceLogsDetailsTable.columns"
+          :dataSource="afterServiceLogsDetailsTable.dataSource"
+          :height="340"
+          :disabled="disabled"
+          :rowNumber="true"
+          :rowSelection="true"
+          :toolbar="true"/>
+      </a-tab-pane>
+    </a-tabs>
+  </a-spin>
+</template>
+
+<script lang="ts">
+  import { defineComponent, ref, reactive, computed, toRaw, onMounted } from 'vue';
+  import { defHttp } from '/@/utils/http/axios';
+  import { useValidateAntFormAndTable } from '/@/hooks/system/useJvxeMethods';
+  import { queryAfterServiceLogsDetailsListByMainId, queryDataById, saveOrUpdate } from '../AfterServiceLogs.api';
+  import { JVxeTable } from '/@/components/jeecg/JVxeTable';
+  import {afterServiceLogsDetailsColumns} from '../AfterServiceLogs.data';
+  import JUpload from '/@/components/Form/src/jeecg/components/JUpload/JUpload.vue';
+  import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';
+  import { Form } from 'ant-design-vue';
+  const useForm = Form.useForm;
+
+  export default defineComponent({
+    name: "AfterServiceLogsForm",
+    components:{
+      JUpload,
+      JVxeTable,
+			JFormContainer,
+    },
+    props:{
+      formDisabled:{
+        type: Boolean,
+        default: false
+      },
+      formData: { type: Object, default: ()=>{} },
+      formBpm: { type: Boolean, default: true }
+    },
+    emits:['success'],
+    setup(props, {emit}) {
+      const loading = ref(false);
+      const formRef = ref();
+      const afterServiceLogsDetailsTableRef = ref();
+      const afterServiceLogsDetailsTable = reactive<Record<string, any>>({
+        loading: false,
+        columns: afterServiceLogsDetailsColumns,
+        dataSource: []
+      });
+      const activeKey = ref('afterServiceLogsDetails');
+      const formData = reactive<Record<string, any>>({
+        id: '',
+        billDate: '',   
+        projectManager: '',   
+        project: '',   
+        projectName: '',   
+        otherProject: '',   
+        customer: '',   
+        customerName: '',   
+        address: '',   
+        schedulingDateBegin: '',   
+        schedulingDateEnd: '',   
+        schedulingMan: '',   
+        maintenanceLog: '',   
+        attsch: '',   
+      });
+
+      //表单验证
+      const validatorRules = reactive({
+      });
+      const {resetFields, validate, validateInfos} = useForm(formData, validatorRules, {immediate: false});
+      const dbData = {};
+      const formItemLayout = {
+        labelCol: {xs: {span: 24}, sm: {span: 5}},
+        wrapperCol: {xs: {span: 24}, sm: {span: 16}},
+      };
+
+      // 表单禁用
+      const disabled = computed(()=>{
+        if(props.formBpm === true){
+          if(props.formData.disabled === false){
+            return false;
+          }else{
+            return true;
+          }
+        }
+        return props.formDisabled;
+      });
+
+      
+
+      function add() {
+        resetFields();
+        afterServiceLogsDetailsTable.dataSource = [];
+      }
+
+      async function edit(row) {
+        //主表数据
+        await queryMainData(row.id);
+        //子表数据
+        const afterServiceLogsDetailsDataList = await queryAfterServiceLogsDetailsListByMainId(row['id']);
+        afterServiceLogsDetailsTable.dataSource = [...afterServiceLogsDetailsDataList];
+      }
+
+      async function queryMainData(id) {
+        const row = await queryDataById(id);
+        resetFields();
+        const tmpData = {};
+        Object.keys(formData).forEach((key) => {
+          if(row.hasOwnProperty(key)){
+            tmpData[key] = row[key]
+          }
+        })
+        //赋值
+        Object.assign(formData,tmpData);
+      }
+
+      const {getSubFormAndTableData, transformData} = useValidateAntFormAndTable(activeKey, {
+        'afterServiceLogsDetails': afterServiceLogsDetailsTableRef,
+      });
+
+      async function getFormData() {
+        try {
+          // 触发表单验证
+          await validate();
+        } catch ({ errorFields }) {
+          if (errorFields) {
+            const firstField = errorFields[0];
+            if (firstField) {
+              formRef.value.scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });
+            }
+          }
+          return Promise.reject(errorFields);
+        }
+        return transformData(toRaw(formData))
+      }
+
+      async function submitForm() {
+        const mainData = await getFormData();
+        const subData = await getSubFormAndTableData();
+        const values = Object.assign({}, dbData, mainData, subData);
+        console.log('表单提交数据', values)
+        const isUpdate = values.id ? true : false
+        await saveOrUpdate(values, isUpdate);
+        //关闭弹窗
+        emit('success');
+      }
+      
+      function setFieldsValue(values) {
+        if(values){
+          Object.keys(values).map(k=>{
+            formData[k] = values[k];
+          });
+        }
+      }
+
+      /**
+       * 值改变事件触发-树控件回调
+       * @param key
+       * @param value
+       */
+      function handleFormChange(key, value) {
+        formData[key] = value;
+      }
+
+
+      return {
+        afterServiceLogsDetailsTableRef,
+        afterServiceLogsDetailsTable,
+        validatorRules,
+        validateInfos,
+        activeKey,
+        loading,
+        formData,
+        setFieldsValue,
+        handleFormChange,
+        formItemLayout,
+        disabled,
+        getFormData,
+        submitForm,
+        add,
+        edit,
+        formRef,
+      }
+    }
+  });
+</script>
+<style lang="less" scoped></style>

+ 67 - 0
src/views/afterCode/AfterServiceLogs/components/AfterServiceLogsModal.vue

@@ -0,0 +1,67 @@
+<template>
+  <BasicModal v-bind="$attrs" @register="registerModal" :title="title" width="95%" @ok="handleSubmit">
+    <after-service-logs-form ref="formComponent" :formDisabled="formDisabled" :formBpm="false" @success="submitSuccess"></after-service-logs-form>
+  </BasicModal>
+</template>
+
+<script lang="ts">
+  import { ref, unref } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import AfterServiceLogsForm from './AfterServiceLogsForm.vue';
+
+  export default {
+    name: "TestCgMainVxeModal",
+    components:{
+      BasicModal,
+      AfterServiceLogsForm
+    },
+    emits:['register','success'],
+    setup(_p, {emit}){
+      const formComponent = ref()
+      const isUpdate = ref(true);
+      const formDisabled = ref(false);
+      const title = ref('')
+
+      //表单赋值
+      const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {
+        setModalProps({confirmLoading: false,showCancelBtn:data?.showFooter,showOkBtn:data?.showFooter});
+        isUpdate.value = !!data?.isUpdate;
+        formDisabled.value = !data?.showFooter;
+        title.value = data?.isUpdate ? (unref(formDisabled) ? '详情' : '编辑') : '新增';
+        if (unref(isUpdate)) {
+          formComponent.value.edit(data.record)
+        }else{
+          formComponent.value.add()
+        }
+      });
+
+      function handleSubmit() {
+        formComponent.value.submitForm();
+      }
+
+      function submitSuccess(){
+        emit('success');
+        closeModal();
+      }
+
+      return {
+        registerModal,
+        title,
+        formComponent,
+        formDisabled,
+        handleSubmit,
+        submitSuccess
+      }
+    }
+  }
+</script>
+<style lang="less" scoped>
+	/** 时间和数字输入框样式 */
+  :deep(.ant-input-number) {
+    width: 100%;
+  }
+
+  :deep(.ant-calendar-picker) {
+    width: 100%;
+  }
+</style>

+ 2 - 2
src/views/purchase/commissionPayRequest/commissionPayRequestList.data.ts

@@ -62,12 +62,12 @@ export const columns: BasicColumn[] = [
    {
     title: '审批(approve)',
     align:"center",
-    dataIndex: 'approve',
+    dataIndex: 'approve_dictText',
    },
    {
     title: '付款(payment)',
     align:"center",
-    dataIndex: 'payment',
+    dataIndex: 'payment_dictText',
    },
 ];
 export const paymentDetailColumns: JVxeColumn[] = [

+ 7 - 1
src/views/purchase/commissionPayRequest/components/commissionPayRequestForm.vue

@@ -309,7 +309,13 @@
           item.orderMoney = item.orderMoney;
           item.id = undefined;
         });
-        formData.sourceCode = formData.sourceCode + ',' + billCodeArr.join(',');
+		
+		if (formData.sourceCode !== '') {
+		  formData.sourceCode = formData.sourceCode + ',' + billCodeArr.join(',');
+		} else {
+		  formData.sourceCode = billCodeArr.join(',');
+		}
+		
         var xTable = paymentDetailsTableRef.value!.getXTable();
         var arrSonFormDelivery = xTable.data.concat(data);
         paymentDetailsTable.dataSource = arrSonFormDelivery;

+ 4 - 0
src/views/purchase/payment/components/paymentForm.vue

@@ -144,6 +144,7 @@
         notes: '',   
         swiftCode:'',
         applyMoney:'',
+        paymentMoney:'',
         paymentRate:'' 
       });
 
@@ -155,6 +156,9 @@
         applyBill: [
           { required: true, message: '请选择申请单(select applyBill)' }
         ],
+        paymentMoney: [
+          { required: true, message: '请填写付款金额' }
+        ],
       });
       const {resetFields, validate, validateInfos} = useForm(formData, validatorRules, {immediate: false});
       const dbData = {};

+ 2 - 2
src/views/purchase/payment/paymentForm.api.ts

@@ -14,8 +14,8 @@ enum Api {
   queryDataById = '/purCode/purPayment/queryById',
   submitBatch='/purCode/purPayment/submitBatch',
   cancelSubmitBatch='/purCode/purPayment/returnSubmitBatch',
-  purPayList='/purCode/purPaymentRequest/list',
-  commissionPayList='/purCode/purCommissionRequest/list',
+  purPayList='/purCode/purPaymentRequest/list?payment=0',
+  commissionPayList='/purCode/purCommissionRequest/list?payment=0',
   supplierList='/cuspCode/cuspSupplierProfile/list',
 }
 /**

+ 1 - 1
src/views/purchase/purPaymentRequest/purPaymentRequest.data.ts

@@ -61,7 +61,7 @@ export const columns: BasicColumn[] = [
    {
     title: '付款(payment)',
     align:"center",
-    dataIndex: 'submit_dictText',
+    dataIndex: 'payment_dictText',
    },
 ];
 export const paymentDetailColumns: JVxeColumn[] = [