Przeglądaj źródła

新增 新增删除功能

YLZH 1 rok temu
rodzic
commit
f822caa0b1

+ 115 - 15
src/api/DemoApi.ts

@@ -28,26 +28,104 @@ export default class DemoApi {
       )
       .then((res) => {
         return res.data;
-      })
+      });
+  }
+  // 获取油品型号
+  // https://miniapp.zhangmushiye.com/bi-api/report/dataapi/project_oil_info
+  static getOilTypeList(data): Promise<BaseResponse<UserInfo>> {
+    let allData = {
+      ...getTime,
+      ...data,
+    };
+    return http
+      .server()
+      .get(
+        'bi-api/report/dataapi/project_oil_info' +
+          `?${Object.keys({ ...getTime, ...data })
+            .map((key) => {
+              return `${key}=${allData[key]}`;
+            })
+            .join('&')}`
+      )
+      .then((res) => {
+        return res.data;
+      });
   }
   //  获取客户列表 getCustomerList
-
   static getCustomerList(data): Promise<BaseResponse<UserInfo>> {
+    let allData = {
+      ...getTime,
+      ...data,
+    };
     return http
-      .server(data)
+      .server()
       .get(
         'bi-api/report/dataapi/customerinfo_api' +
-          `?${Object.keys(getTime)
+          `?${Object.keys(allData)
             .map((key) => {
-              return `${key}=${getTime[key]}`;
+              return `${key}=${allData[key]}`;
             })
             .join('&')}`
       )
       .then((res) => {
         return res.data;
-      })
+      });
   }
 
+  // https://miniapp.zhangmushiye.com/bi-api/report/dataapi/payment_api
+  //开票公司
+  static getInvoiceCompanyList(data): Promise<BaseResponse<UserInfo>> {
+    let allData = {
+      ...getTime,
+      ...data,
+    };
+    return http
+      .server()
+      .get(
+        'bi-api/report/dataapi/payment_api' +
+          `?${Object.keys(allData)
+            .map((key) => {
+              return `${key}=${allData[key]}`;
+            })
+            .join('&')}`
+      )
+      .then((res) => {
+        return res.data;
+      });
+  }
+  // 获取单价 /bi-api/report/dataapi/odsbuy
+  static getUnitPriceList(data): Promise<BaseResponse<UserInfo>> {
+    return http
+      .server()
+      .get(
+        'bi-api/report/dataapi/odsbuy' +
+          `?${Object.keys(data)
+            .map((key) => {
+              return `${key}=${data[key]}`;
+            })
+            .join('&')}`
+      )
+      .then((res) => {
+        return res.data;
+      });
+  }
+  // 获取客户getKehuList
+  // /bi-api/report/dataapi/customerinfo_api
+  static getKehuList(data): Promise<BaseResponse<UserInfo>> {
+    return http
+      .server()
+      .get(
+        'bi-api/report/dataapi/customerinfo_api' +
+          `?${Object.keys(data)
+            .map((key) => {
+              return `${key}=${data[key]}`;
+            })
+            .join('&')}`
+      )
+      .then((res) => {
+        return res.data;
+      });
+  }
   // config 结算管理 接口
   static getConfig(data): Promise<BaseResponse<Chanel[]>> {
     return http
@@ -55,7 +133,7 @@ export default class DemoApi {
       .get('visual-api/paas/visualdev/OnlineDev/' + data + '/Config')
       .then((res) => {
         return res.data;
-      })
+      });
   }
   // 项目列表
   static getFormDataList(data): Promise<BaseResponse<Chanel[]>> {
@@ -64,7 +142,7 @@ export default class DemoApi {
       .post('bi-api/cube/browser/' + data.dbLinkId, data)
       .then((res) => {
         return res.data;
-      })
+      });
   }
   // 获取表单Url
   static getSelectOptionsUrl(id): Promise<BaseResponse<Chanel[]>> {
@@ -73,7 +151,7 @@ export default class DemoApi {
       .get('bi-api/report/dataapi/detail?id=' + id)
       .then((res) => {
         return res.data;
-      })
+      });
   }
   // 根据url拼接
   static getSelectOptionsUrlByParams(url): Promise<BaseResponse<Chanel[]>> {
@@ -89,7 +167,7 @@ export default class DemoApi {
       )
       .then((res) => {
         return res.data;
-      })
+      });
   }
   // 编辑
   // https://miniapp.zhangmushiye.com/visual-api/paas/visualdev/OnlineDev/v2
@@ -97,14 +175,36 @@ export default class DemoApi {
     return http
       .server()
       .put(
-        'visual-api/paas/visualdev/OnlineDev/v2/' +
-          data.formKey +
-          '/' +
-          data.id,
+        'visual-api/paas/visualdev/OnlineDev/v2/' + data.formKey + data.id,
+        data.data
+      )
+      .then((res) => {
+        return res.data;
+      });
+  }
+  static getAddData(data): Promise<BaseResponse<Chanel[]>> {
+    return http
+      .server()
+      .post(
+        'visual-api/paas/visualdev/OnlineDev/v2/' + data.formKey + data.id,
         data.data
       )
       .then((res) => {
         return res.data;
-      })
+      });
+  }
+  static deleteListData(data): Promise<BaseResponse<Chanel[]>> {
+    return http
+      .server()
+      .delete(
+        'visual-api/paas/visualdev/OnlineDev/' +
+          data.formKey +
+          data.id +
+          '?dataJson=' +
+          data.jsonData
+      )
+      .then((res) => {
+        return res.data;
+      });
   }
 }

+ 49 - 12
src/components/formList.vue

@@ -92,6 +92,35 @@
             @change="handleChangeFile"
           />
         </wd-cell>
+        <!-- radio -->
+
+        <wd-cell
+          v-if="item.__config__.jnpfKey === 'radio'"
+          :title="item.__config__.label"
+          :title-width="labelWidth"
+          :prop="item.__vModel__"
+        >
+          <view style="text-align: left">
+            <wd-radio-group
+              v-model="dataForm[item.__vModel__]"
+              :label="item.__config__.label"
+              :placeholder="item.placeholder"
+              :disabled="item.disabled"
+              :readonly="item.readonly"
+              :clearable="item.clearable"
+              :shape="'dot'"
+              inline
+            >
+              <wd-radio
+                v-for="(radioItem, rk) in item.__slot__.options"
+                :key="rk"
+                :value="radioItem[item.__config__.props.value]"
+              >
+                {{ radioItem[item.__config__.props.label] }}
+              </wd-radio>
+            </wd-radio-group>
+          </view>
+        </wd-cell>
       </template>
     </wd-cell-group>
     <view class="footer">
@@ -176,6 +205,11 @@ function handleSubmit() {
             },
           ],
         };
+        // 如果 id 存在则是编辑
+        if (!id.value) {
+          delete params.data.id;
+        }
+
         DemoApi.getEditData(params).then((res) => {
           toast.close();
           if (uplodKey.value) {
@@ -208,11 +242,23 @@ watch(
 );
 function initSelectOptions() {
   filedList.value.forEach((item) => {
-    if (item.__config__.jnpfKey === 'select' && dataForm.value[item.__vModel__] !== '') {
+    if (item.__config__.jnpfKey === 'select') {
       const findAll = item.__slot__.options.find(
         (cell) => cell[item.__config__.props.value] === dataForm.value[item.__vModel__]
       );
       if (!findAll) {
+        DemoApi.getSelectOptionsUrl(item.__config__.propsUrl).then((res) => {
+          let url = 'bi-api' + res.data.apiUrl;
+          // 去除第一位的/
+          DemoApi.getSelectOptionsUrlByParams(url).then((resp) => {
+            item.__slot__.options = resp.data.map((cell) => {
+              let obj = {};
+              obj[item.__config__.props.label] = cell[item.__config__.apiProps.value];
+              console.log('🚀 ~ item.__slot__.options=resp.data.map ~ obj:', obj);
+              return obj;
+            });
+          });
+        });
         item.__slot__.options = [
           {
             [item.__config__.props.value]: dataForm.value[item.__vModel__],
@@ -220,17 +266,8 @@ function initSelectOptions() {
           },
         ];
       }
-    } //   DemoApi.getSelectOptionsUrl(item.__config__.propsUrl).then((res) => {
-    //     let url = 'bi-api' + res.data.apiUrl;
-    //     // 去除第一位的/
-    //     DemoApi.getSelectOptionsUrlByParams(url).then((resp) => {
-    //       item.selectOptions = resp.data.map((cell) => {
-    //         let obj = {};
-    //         obj[item.__config__.props.value] = cell.项目名称;
-    //         return obj;
-    //       });
-    //     });
-    //   });
+    }
+
     // } else if (item.__config__.jnpfKey === 'select') {
     //   item.selectOptions = item.__slot__.options || [];
     // }

+ 1 - 1
src/http/HttpClient.ts

@@ -99,7 +99,7 @@ export default class ApiClient {
               (pages[pages.length - 1].$page &&
                 pages[pages.length - 1].$page.fullPath !== '/pages/login/Login')
             ) {
-              uni.reLaunch({ url: '/pagesOther/login/Login' })
+              uni.reLaunch({ url: '/pages/login/Login' })
             }
             break
 

+ 245 - 19
src/pages/oils/form.vue

@@ -1,19 +1,94 @@
 <template>
   <view class="settlement-form">
-    <form-list
-      :id="id"
-      :filed-list="formDataSet.fields"
-      :form-key="formKey"
-      :data-form="dataForm"
-      :old-form-data="JSON.stringify(dataForm)"
-    />
+    <wd-form ref="form" :model="dataForm" :rules="rules">
+      <wd-cell-group>
+        <!-- 项目名称 -->
+        <wd-select-picker
+          v-model="dataForm[396]"
+          :columns="projectList"
+          label="项目名称"
+          :prop="'396'"
+          placeholder="请选择项目名称"
+          @change="projectNameChange"
+          type="radio"
+        />
+        <!-- 项目编号396 -->
+        <wd-input
+          v-model="dataForm[396]"
+          :label="'项目编号'"
+          :prop="'396'"
+          :placeholder="'请输入项目编号'"
+          type="number"
+          :disabled="true"
+        />
+        <!-- 省 398-->
+        <wd-input
+          v-model="dataForm[398]"
+          :label="'省'"
+          :prop="'398'"
+          :placeholder="'请输入省'"
+          type="text"
+          :disabled="true"
+        />
+        <!-- 详细地址 399 -->
+        <wd-input
+          v-model="dataForm[399]"
+          :label="'详细地址'"
+          :prop="'399'"
+          :placeholder="'请输入详细地址'"
+          type="text"
+          :disabled="true"
+        />
+        <wd-select-picker
+          v-model="dataForm[400]"
+          :columns="oilList"
+          label="油品名称"
+          :prop="'400'"
+          placeholder="请选择油品名称"
+          type="radio"
+          @change="ypNameChange"
+          v-if="dataForm[396]"
+        />
+        <!-- 油品型号 401 -->
+        <wd-select-picker
+          v-model="dataForm[401]"
+          :columns="oilTypeList"
+          label="油品型号"
+          :prop="'401'"
+          placeholder="请选择油品型号"
+          type="radio"
+          @change="oilTypeChange"
+          v-if="dataForm[396]"
+        />
+        <!-- 合同定油品密度405-->
+        <wd-input
+          v-model="dataForm[405]"
+          :label="'合同定油品密度'"
+          :prop="'405'"
+          :placeholder="'请输入合同定油品密度'"
+          type="number"
+        />
+        <!-- 送油单价 406 -->
+        <wd-input
+          v-model="dataForm[406]"
+          :label="'送油单价'"
+          :prop="'406'"
+          :placeholder="'请输入送油单价'"
+          type="number"
+        />
+      </wd-cell-group>
+      <view class="footer">
+        <wd-button type="primary" size="large" block @click="handleSubmit">提交</wd-button>
+      </view>
+    </wd-form>
+    <wd-toast />
   </view>
 </template>
 <script setup lang="ts">
 import DemoApi from '@/api/DemoApi';
-import formList from '@/components/formList.vue';
 import config from '@/http/config';
-
+import { useToast } from 'wot-design-uni';
+
 const formKey = ref<string>('');
 const id = ref<string>('');
 const filedsData = ref<Object>([]);
@@ -22,7 +97,9 @@ onLoad((option) => {
   filedsData.value = JSON.parse(option.filedsData || '{}');
   id.value = filedsData.value.id;
   init();
-})
+});
+const toast = useToast();
+
 const formDataSet = ref({});
 const dataForm = ref({});
 const rules = ref({});
@@ -32,26 +109,175 @@ function init() {
     const obj = {};
     const objAllSet = {};
     formDataSet.value.fields.map((item) => {
-      obj[item.__vModel__] = item.defaultValue || null;
+      obj[item.__vModel__] = item.defaultValue || '';
+      if (item.__config__.jnpfKey === 'date') {
+        obj[item.__vModel__] = new Date().getTime();
+      }
       objAllSet[item.__vModel__] = item.__config__.jnpfKey;
       if (item.__config__.required) {
         rules.value[item.__vModel__] = [
           { required: true, message: item.__config__.label + '未填写' },
         ];
-      }
+      }
     });
-
+
     Object.keys(obj).map((key) => {
       Object.values(filedsData.value).map((item) => {
         if (parseInt(item.fieldId) === parseInt(key)) {
           obj[key] = item.value;
-        }
+        }
       });
-      if (objAllSet[key] === 'date') {
-        obj[key] = new Date(obj[key]).getTime();
-      }
     });
     dataForm.value = obj;
-  })
-}
+    oldFormData.value = JSON.stringify(obj);
+    initProjectList();
+    initOilTypeList();
+  });
+}
+function oilTypeChange({ value }) {
+  dataForm.value[401] = value;
+}
+function ypNameChange({ value }) {
+  dataForm.value[400] = value;
+}
+const projectList = ref([]);
+function initProjectList() {
+  DemoApi.getProjectNameList().then((res) => {
+    projectList.value = res.data.map((item) => {
+      return {
+        label: item.项目名称,
+        value: item.项目编号,
+        s: item.省,
+        xxdz: item.详细地址,
+      };
+    });
+    // 如果 dataForm.value[541] 的值不属于项目列表,push进去
+    let type = projectList.value.some((item) => item.value === dataForm.value[396]);
+    if (dataForm.value[396] && !type) {
+      projectList.value.push({
+        label: dataForm.value[397],
+        value: dataForm.value[396],
+        s: dataForm.value[398],
+        prjId: dataForm.value[366],
+      });
+    }
+  });
+}
+const oilList = ref([
+  // 柴油 汽油
+  { label: '柴油', value: '柴油' },
+  { label: '汽油', value: '汽油' },
+]);
+watch(
+  () => dataForm.value[396],
+  (newVal) => {
+    if (newVal) {
+      allInit();
+    }
+  }
+);
+watch(
+  () => dataForm.value[400],
+  (newVal) => {
+    if (newVal) {
+      initOilTypeList();
+    }
+  }
+);
+
+function allInit() {
+  initProjectList();
+  initOilTypeList();
+}
+const oilTypeList = ref([]);
+function initOilTypeList() {
+  let params = {
+    projectid: dataForm.value[396],
+    ypmc: dataForm.value[400],
+  };
+  DemoApi.getOilTypeList(params).then((res) => {
+    oilTypeList.value = res.data.map((item) => {
+      return {
+        label: item.油品型号,
+        value: item.油品型号,
+        md: item.合同定油品密度,
+      };
+    });
+  });
+}
+
+function projectNameChange({ value }) {
+  dataForm.value[396] = value;
+  dataForm.value[397] = projectList.value.find((item) => item.value === value).label;
+  dataForm.value[399] = projectList.value.find((item) => item.value === value).xxdz;
+  dataForm.value[398] = projectList.value.find((item) => item.value === value).s;
+}
+
+const form = ref();
+const oldFormData = ref('');
+function handleSubmit() {
+  form.value
+    .validate()
+    .then(({ valid, errors }) => {
+      if (valid) {
+        const params = {
+          id: id.value ? '/' + id.value : '',
+          formKey: formKey.value,
+          data: [
+            {
+              data: JSON.stringify(dataForm.value),
+              id: id.value ? id.value : '',
+              oldData: id.value ? oldFormData.value : null,
+            },
+          ],
+        };
+        // 如果 id 存在则是编辑 否则是新增getAddData
+        if (id.value) {
+          DemoApi.getEditData(params).then((res) => {
+            toast.close();
+
+            if (res.code === 200) {
+              // 如果res.data是数组则提示新增成功
+              setTimeout(() => {
+                uni.redirectTo({
+                    url: '/pages/oils/list',
+                  });
+              }, 3000);
+            } else {
+              toast.error('提交失败');
+            }
+          });
+        } else {
+          DemoApi.getAddData(params).then((res) => {
+            toast.close();
+            if (res.code === 200) {
+              // 如果res.data是数组则提示新增成功
+              if (res.data.length > 0) {
+                toast.success('新增成功');
+                // 返回上一页
+                // 三秒后返回上一页
+                setTimeout(() => {
+                  uni.redirectTo({
+                    url: '/pages/oils/list',
+                  });
+                }, 3000);
+              } else {
+                toast.success('更新成功');
+              }
+            } else {
+              toast.error('提交失败');
+            }
+          });
+        }
+      }
+    })
+    .catch((error) => {
+      console.log(error, 'error');
+    });
+}
 </script>
+<style lang="scss" scoped>
+.footer {
+  padding-bottom: 20px;
+}
+</style>

+ 68 - 5
src/pages/oils/list.vue

@@ -18,6 +18,9 @@
         </template>
       </wd-search>
     </view>
+    <view class="page-edit">
+      <wd-button @click="addData">新增</wd-button>
+    </view>
     <wd-action-sheet
       v-model="showSheet"
       :title="searchType"
@@ -34,8 +37,10 @@
               <view>{{ field.content }}: {{ item[field.field].value }}</view>
             </template>
           </view>
-          <view class="">
-            <wd-button size="small" type="warning" @click="goEdit(item)">编辑</wd-button>
+          <view class="list-edit-btn">
+            <wd-button size="small" @click="goEdit(item)">编辑</wd-button>
+            <!-- 删除 -->
+            <wd-button size="small" type="warning" @click="deleteData(item)">删除</wd-button>
           </view>
         </view>
       </wd-card>
@@ -50,12 +55,15 @@
       @change="handleChangePagination"
     />
   </view>
+  <wd-toast />
+  <wd-message-box />
 </template>
 <script setup lang="ts">
 import DemoApi from '@/api/DemoApi';
 import router from '@/router';
 import { ref } from 'vue';
-import { useToast } from 'wot-design-uni';
+import { useToast, useMessage } from 'wot-design-uni';
+const message = useMessage();
 const show = ref<boolean>(false);
 const searchType = ref<string>('项目名称');
 const value = ref<string>('');
@@ -139,7 +147,9 @@ const getProjectList = () => {
   });
 };
 getProjectList();
-
+onLoad(() => {
+  getSettlementList();
+});
 function close() {
   showSheet.value = false;
 }
@@ -168,7 +178,9 @@ const pageQuery = ref({
   descs: 536,
   total: 0,
 });
-
+onLoad(() => {
+  getSettlementList();
+});
 // 获取结算管理列表
 const formKey = ref<string>('a6decb955c72427dedf7db22a4142934');
 const idKeyData = ref<string>('');
@@ -250,6 +262,45 @@ function goEdit(item) {
     query: { filedsData: JSON.stringify(item || '[]'), formKey: formKey.value },
   });
 }
+function addData() {
+  router.push({
+    path: 'pages/oils/form',
+    query: { filedsData: '[]', formKey: formKey.value },
+  });
+}
+// 删除
+function deleteData(item) {
+  let obj = {};
+  Object.values(item).map((val) => {
+    // val是对象的情况下
+    if (typeof val === 'object') {
+      obj[val.fieldId] = val.value;
+    }
+  });
+  message
+    .confirm({
+      msg: '此操作将永久删除该数据, 是否继续?',
+      title: '提示',
+    })
+    .then(() => {
+      let jsonData = JSON.stringify(obj);
+      let urlParams = `dataJson=${jsonData}`;
+      uni.request({
+        url:
+          config.baseURL + '/visual-api/paas/visualdev/OnlineDev/' + formKey.value + '/' + item.id,
+        method: 'DELETE',
+        data: urlParams,
+        header: {
+          'content-type': 'application/x-www-form-urlencoded;charset=UTF-8',
+          'Blade-Auth': 'bearer ' + uni.getStorageSync('token'),
+        },
+        success: (res) => {
+          toast.success('删除成功');
+          getSettlementList();
+        },
+      });
+    });
+}
 </script>
 
 <style lang="scss" scoped>
@@ -294,4 +345,16 @@ function goEdit(item) {
   width: 100%;
   z-index: 1;
 }
+.page-edit {
+  margin-top: 40rpx;
+  text-align: right;
+  padding: 0 20rpx 0 0;
+}
+.list-edit-btn {
+  display: flex;
+  flex-direction: column;
+  ::v-deep button {
+    margin-bottom: 20rpx;
+  }
+}
 </style>

+ 446 - 12
src/pages/settlement/form.vue

@@ -1,19 +1,155 @@
 <template>
   <view class="settlement-form">
-    <form-list
-      :key="showFormList"
-      :id="id"
-      :filed-list="formDataSet.fields"
-      :form-key="formKey"
-      :uplod-key="544"
-      :old-form-data="JSON.stringify(dataForm)"
-    />
+    <wd-form ref="form" :model="dataForm" :rules="rules">
+      <wd-cell-group>
+        <wd-calendar
+          v-model="dataForm[536]"
+          label="开票日期"
+          :prop="'536'"
+          placeholder="请选择开票日期"
+          type="date"
+        />
+        <wd-calendar
+          v-model="dataForm[741]"
+          label="结算开始日期"
+          :prop="'741'"
+          placeholder="请选择结算结束日期"
+          type="date"
+        />
+        <wd-calendar
+          v-model="dataForm[742]"
+          label="结算结束日期"
+          :prop="'742'"
+          placeholder="请选择结算结束日期"
+          type="date"
+        />
+        <!-- 项目名称 -->
+        <wd-select-picker
+          v-model="dataForm[540]"
+          :columns="projectList"
+          label="项目名称"
+          :prop="'540'"
+          placeholder="请选择项目名称"
+          @change="projectNameChange"
+          type="radio"
+        />
+        <wd-select-picker
+          v-model="dataForm[537]"
+          :columns="oilList"
+          label="油品名称"
+          :prop="'537'"
+          placeholder="请选择油品名称"
+          type="radio"
+          @change="ypNameChange"
+          v-if="dataForm[541]"
+        />
+        <!-- 油品型号 538 -->
+        <wd-select-picker
+          v-model="dataForm[538]"
+          :columns="oilTypeList"
+          label="油品型号"
+          :prop="'538'"
+          placeholder="请选择油品型号"
+          type="radio"
+          @change="oilTypeChange"
+          v-if="dataForm[537] && dataForm[541]"
+        />
+        <!-- 升 548 -->
+        <wd-cell title="升" :prop="'548'" title-width="150rpx">
+          <view style="text-align: left">
+            <wd-input-number
+              v-model="dataForm[548]"
+              :placeholder="'请选择'"
+              :min="0"
+              :precision="2"
+              input-width="140rpx"
+              @change="onChangeL"
+            />
+          </view>
+        </wd-cell>
+        <!-- 密度 549 input number -->
+        <wd-input
+          v-model="dataForm[549]"
+          :label="'密度'"
+          :prop="'549'"
+          :placeholder="'请输入密度'"
+          type="number"
+          :disabled="true"
+        />
+        <!-- 吨 550  -->
+        <wd-input
+          v-model="dataForm[550]"
+          :label="'吨'"
+          :prop="'550'"
+          :placeholder="'请输入吨'"
+          type="number"
+          :disabled="true"
+        />
+        <!-- 单价 551 -->
+        <wd-input
+          v-model="dataForm[551]"
+          :label="'单价'"
+          :prop="'551'"
+          :placeholder="'请输入单价'"
+          type="number"
+          :disabled="true"
+        />
+        <!-- 金额 552 -->
+        <wd-input
+          v-model="dataForm[552]"
+          :label="'金额'"
+          :prop="'552'"
+          :placeholder="'请输入金额'"
+          type="number"
+        />
+        <wd-cell :title="'发票上传'" title-width="150rpx" :prop="'544'">
+          <wd-upload
+            :file-list="dataForm[544]"
+            :action="config.baseURL + 'api/file/uploadFile'"
+            @change="handleChangeFile"
+          />
+        </wd-cell>
+        <!--开票公司543 -->
+        <wd-select-picker
+          v-if="dataForm[540]"
+          v-model="dataForm[543]"
+          :columns="companyList"
+          label="开票公司"
+          :prop="'543'"
+          placeholder="请选择开票公司"
+          type="radio"
+        />
+        <!-- 客户名称 542 -->
+        <wd-select-picker
+          v-if="dataForm[540]"
+          v-model="dataForm[542]"
+          :columns="kehuList"
+          label="客户名称"
+          :prop="'542'"
+          placeholder="请选择客户名称"
+          type="radio"
+        />
+        <!-- isInvoice 是否开发票 539 -->
+        <wd-select-picker
+          v-model="dataForm[539]"
+          :columns="isInvoice"
+          label="是否开发票"
+          :prop="'539'"
+          placeholder="请选择是否开发票"
+          type="radio"
+        />
+      </wd-cell-group>
+      <view class="footer">
+        <wd-button type="primary" size="large" block @click="handleSubmit">提交</wd-button>
+      </view>
+    </wd-form>
+    <wd-toast />
   </view>
 </template>
 <script setup lang="ts">
 import DemoApi from '@/api/DemoApi';
-import formList from '@/components/formList.vue';
 import config from '@/http/config';
+import { useToast } from 'wot-design-uni';
 
 const formKey = ref<string>('');
 const id = ref<string>('');
@@ -24,9 +160,26 @@ onLoad((option) => {
   id.value = filedsData.value.id;
   init();
 });
+const toast = useToast();
+
 const formDataSet = ref({});
 const dataForm = ref({});
-const rules = ref({});
+const rules = ref({
+  //项目名称 油品类型 油品名称 金额 升 开票公司 必填
+  540: [{ required: true, message: '项目名称未填写' }],
+
+  537: [{ required: true, message: '油品名称未填写' }],
+  538: [{ required: true, message: '油品型号未填写' }],
+  552: [
+    { required: true, message: '金额未填写' },
+    // 金额不能有字符 但是可以有小数位
+    { pattern: /^[0-9]+(.[0-9]{1,2})?$/, message: '金额格式不正确' },
+  ],
+  548: [{ required: true, message: '升未填写' }],
+  543: [{ required: true, message: '开票公司未填写' }],
+  542: [{ required: true, message: '客户名称未填写' }],
+  539: [{ required: true, message: '是否开发票未填写' }],
+});
 const showFormList = ref(1);
 function init() {
   DemoApi.getConfig(formKey.value).then((res) => {
@@ -34,7 +187,11 @@ function init() {
     const obj = {};
     const objAllSet = {};
     formDataSet.value.fields.map((item) => {
-      obj[item.__vModel__] = item.defaultValue || null;
+      obj[item.__vModel__] = item.defaultValue || '';
+      if (item.__config__.jnpfKey === 'date') {
+        // 13位时间戳 代表当天时间 不算时分秒
+        obj[item.__vModel__] = new Date(new Date().toLocaleDateString()).getTime();
+      }
       objAllSet[item.__vModel__] = item.__config__.jnpfKey;
       if (item.__config__.required) {
         rules.value[item.__vModel__] = [
@@ -69,7 +226,284 @@ function init() {
       }
     });
     dataForm.value = obj;
-    showFormList.value += 1;
+    oldFormData.value = JSON.stringify(obj);
+    initProjectList();
+  });
+}
+const projectList = ref([]);
+function initProjectList() {
+  DemoApi.getProjectNameList().then((res) => {
+    projectList.value = res.data.map((item) => {
+      return {
+        label: item.项目名称,
+        value: item.项目编号,
+      };
+    });
+    // 如果 dataForm.value[541] 的值不属于项目列表,push进去
+    let type = projectList.value.some((item) => item.value === dataForm.value[541]);
+    if (dataForm.value[541] && !type) {
+      projectList.value.push({
+        label: dataForm.value[541],
+        value: dataForm.value[541],
+        prjId: dataForm.value[540],
+      });
+    }
+  });
+}
+const oilList = ref([
+  // 柴油 汽油
+  { label: '柴油', value: '柴油' },
+  { label: '汽油', value: '汽油' },
+]);
+watch(
+  () => dataForm.value[541],
+  (newVal) => {
+    if (newVal) {
+      allInit();
+      getPriceList();
+    }
+  }
+);
+watch(
+  () => dataForm.value[537],
+  (newVal) => {
+    if (newVal) {
+      initOilTypeList();
+    }
+  }
+);
+
+function allInit() {
+  initProjectList();
+  initOilTypeList();
+  getPriceList();
+  getInvoiceCompanyLists();
+  getKehuLists();
+}
+const oilTypeList = ref([]);
+function initOilTypeList() {
+  let params = {
+    projectid: dataForm.value[540],
+    ypmc: dataForm.value[537],
+  };
+  DemoApi.getOilTypeList(params).then((res) => {
+    oilTypeList.value = res.data.map((item) => {
+      return {
+        label: item.油品型号,
+        value: item.油品型号,
+        md: item.合同定油品密度,
+      };
+    });
+  });
+}
+function oilTypeChange({ value }) {
+  dataForm.value[538] = value;
+  dataForm.value[549] = oilTypeList.value.find((item) => item.value === value).md;
+  findPrice();
+}
+function ypNameChange({ value }) {
+  dataForm.value[537] = value;
+  findPrice();
+}
+// 升变化 根据密度和升计算吨
+function onChangeL({ value }) {
+  dataForm.value[548] = value;
+  dataForm.value[550] = ((dataForm.value[548] * dataForm.value[549]) / 1000).toFixed(2);
+}
+// 上传
+function handleChangeFile({ fileList }) {
+  // 如果不是数组
+  const arr = [];
+  if (!Array.isArray(fileList)) {
+    fileList = [];
+  }
+  for (let i = 0; i < fileList.length; i++) {
+    const val = fileList[i];
+    const response = JSON.parse(val.response);
+    if (response.code === 200) {
+      const obj = {
+        url: config.baseURL + response.msg,
+        name: response.msg,
+        fileld: response.msg,
+      };
+      arr.push(obj);
+    }
+  }
+  dataForm.value[544] = arr;
+}
+// 获取开票公司
+const companyList = ref([]);
+// getInvoiceCompanyList
+function getInvoiceCompanyLists() {
+  DemoApi.getInvoiceCompanyList({
+    ppid: dataForm.value[540],
+  }).then((res) => {
+    companyList.value = res.data.map((item) => {
+      return {
+        label: item.付款单位名称,
+        value: item.付款单位名称,
+      };
+    });
+    if (
+      dataForm.value[543] &&
+      !companyList.value.some((item) => item.value === dataForm.value[543])
+    ) {
+      companyList.value.push({
+        label: dataForm.value[543],
+        value: dataForm.value[543],
+      });
+    }
   });
 }
+// 获取单价
+const priceList = ref([]);
+// getPriceList
+function getPriceList() {
+  DemoApi.getUnitPriceList({
+    xiangmu_id: dataForm.value[540],
+  }).then((res) => {
+    priceList.value = res.data;
+    findPrice();
+  });
+}
+function findPrice() {
+  if (priceList.value === undefined) {
+    return;
+  }
+
+  const find = priceList.value.find(
+    (item) =>
+      // 型号 名称
+      item.COL_3 === dataForm.value[538] && item.COL_2 === dataForm.value[537]
+  );
+  if (!find) {
+    return 0;
+  }
+  dataForm.value[551] = find.COL_5;
+}
+function projectNameChange({ value }) {
+  dataForm.value[540] = value;
+  dataForm.value[541] = projectList.value.find((item) => item.value === value).label;
+}
+// 获取客户kehuList
+const kehuList = ref([]);
+function getKehuLists() {
+  DemoApi.getKehuList({
+    projectid: dataForm.value[540],
+  }).then((res) => {
+    kehuList.value = res.data.map((item) => {
+      return {
+        label: item.客户名称,
+        value: item.客户名称,
+      };
+    });
+    if (dataForm.value[542] && !kehuList.value.some((item) => item.value === dataForm.value[542])) {
+      kehuList.value.push({
+        label: dataForm.value[542],
+        value: dataForm.value[542],
+      });
+    }
+  });
+}
+// 是否发票
+const isInvoice = ref([
+  {
+    label: '是',
+    value: '是',
+  },
+  {
+    label: '否',
+    value: '否',
+  },
+]);
+const form = ref();
+const oldFormData = ref('');
+function handleSubmit() {
+  form.value
+    .validate()
+    .then(({ valid, errors }) => {
+      if (valid) {
+        dataForm.value[544] = dataForm.value[544].map((item) => {
+          return {
+            name: item.name,
+            fileld: item.fileld,
+            url: item.fileld,
+          };
+        });
+
+        const params = {
+          id: id.value ? '/' + id.value : '',
+          formKey: formKey.value,
+          data: [
+            {
+              data: JSON.stringify(dataForm.value),
+              id: id.value ? id.value : '',
+              oldData: id.value ? oldFormData.value : null,
+            },
+          ],
+        };
+        // 如果 id 存在则是编辑 否则是新增getAddData
+        if (id.value) {
+          DemoApi.getEditData(params).then((res) => {
+            toast.close();
+            dataForm.value[544] = dataForm.value[544].map((item) => {
+              return {
+                name: item.name,
+                fileld: item.fileld,
+                url: config.baseURL + item.fileld,
+              };
+            });
+
+            if (res.code === 200) {
+              // 如果res.data是数组则提示新增成功
+              setTimeout(() => {
+                uni.redirectTo({
+                    url: '/pages/settlement/list',
+                  });
+              }, 3000);
+            } else {
+              toast.error('提交失败');
+            }
+          });
+        } else {
+          DemoApi.getAddData(params).then((res) => {
+            toast.close();
+            dataForm.value[544] = dataForm.value[544].map((item) => {
+              return {
+                name: item.name,
+                fileld: item.fileld,
+                url: config.baseURL + item.fileld,
+              };
+            });
+
+            if (res.code === 200) {
+              // 如果res.data是数组则提示新增成功
+              if (res.data.length > 0) {
+                toast.success('新增成功');
+                // 返回上一页
+                // 三秒后返回上一页
+                setTimeout(() => {
+                  uni.redirectTo({
+                    url: '/pages/settlement/list',
+                  });
+                }, 3000);
+              } else {
+                toast.success('更新成功');
+              }
+            } else {
+              toast.error('提交失败');
+            }
+          });
+        }
+      }
+    })
+    .catch((error) => {
+      console.log(error, 'error');
+    });
+}
 </script>
+<style lang="scss" scoped>
+.footer {
+  padding-bottom: 20px;
+}
+</style>

+ 68 - 9
src/pages/settlement/list.vue

@@ -18,6 +18,10 @@
         </template>
       </wd-search>
     </view>
+    <view class="page-edit">
+      <wd-button @click="addData">新增</wd-button>
+      <!-- 删除 -->
+    </view>
     <wd-action-sheet
       v-model="showSheet"
       :title="searchType"
@@ -34,8 +38,10 @@
               <view>{{ field.content }}: {{ item[field.field].value }}</view>
             </template>
           </view>
-          <view class="">
-            <wd-button size="small" type="warning" @click="goEdit(item)">编辑</wd-button>
+          <view class="list-edit-btn">
+            <wd-button size="small" @click="goEdit(item)">编辑</wd-button>
+            <!-- 删除 -->
+            <wd-button size="small" type="warning" @click="deleteData(item)">删除</wd-button>
           </view>
         </view>
       </wd-card>
@@ -50,12 +56,16 @@
       @change="handleChangePagination"
     />
   </view>
+  <wd-toast />
+  <wd-message-box />
 </template>
 <script setup lang="ts">
 import DemoApi from '@/api/DemoApi';
+import config from '@/http/config';
 import router from '@/router';
 import { ref } from 'vue';
-import { useToast } from 'wot-design-uni';
+import { useToast, useMessage } from 'wot-design-uni';
+const message = useMessage();
 const show = ref<boolean>(false);
 const searchType = ref<string>('项目名称');
 const value = ref<string>('');
@@ -68,10 +78,7 @@ const menu = ref([
     content: '油品名称',
     filedName: 'oilName',
   },
-  {
-    content: '客户名称',
-    filedName: 'customerName',
-  },
+
 ]);
 const showListField = ref([
   {
@@ -210,8 +217,8 @@ const getSettlementList = () => {
       };
       if (searchForm.value[item.filedName]) {
         obj.values.push(searchForm.value[item.filedName]);
+        params.paramList.push(obj);
       }
-      params.paramList.push(obj);
     });
 
     DemoApi.getFormDataList(params).then((resp) => {
@@ -255,12 +262,52 @@ getSettlementList();
 function handleChangePagination() {
   getSettlementList();
 }
+// 删除
+function deleteData(item) {
+  let obj = {};
+  Object.values(item).map((val) => {
+    // val是对象的情况下
+    if (typeof val === 'object') {
+      obj[val.fieldId] = val.value;
+    }
+  });
+  message
+    .confirm({
+      msg: '此操作将永久删除该数据, 是否继续?',
+      title: '提示',
+    })
+    .then(() => {
+      let jsonData = JSON.stringify(obj);
+      let urlParams = `dataJson=${jsonData}`;
+      uni.request({
+        url:
+          config.baseURL + '/visual-api/paas/visualdev/OnlineDev/' + formKey.value + '/' + item.id,
+        method: 'DELETE',
+        data: urlParams,
+        header: {
+          'content-type': 'application/x-www-form-urlencoded;charset=UTF-8',
+          'Blade-Auth': 'bearer ' + uni.getStorageSync('token'),
+        },
+        success: (res) => {
+          toast.success('删除成功');
+          getSettlementList();
+        },
+      });
+    });
+}
 function goEdit(item) {
   router.push({
     path: 'pages/settlement/form',
-    query: { filedsData: JSON.stringify(item || '[]'), formKey: formKey.value },
+    query: { filedsData: JSON.stringify(item || []), formKey: formKey.value },
   });
 }
+function addData() {
+  router.push({
+    path: 'pages/settlement/form',
+    query: { filedsData: '[]', formKey: formKey.value },
+  });
+}
+
 </script>
 
 <style lang="scss" scoped>
@@ -305,4 +352,16 @@ function goEdit(item) {
   width: 100%;
   z-index: 1;
 }
+.page-edit {
+  margin-top: 40rpx;
+  text-align: right;
+  padding: 0 20rpx 0 0;
+}
+.list-edit-btn {
+  display: flex;
+  flex-direction: column;
+  ::v-deep button {
+    margin-bottom: 20rpx;
+  }
+}
 </style>