YLZH пре 10 месеци
родитељ
комит
d5d193cf4f

+ 87 - 2
src/api/DemoApi.ts

@@ -112,13 +112,14 @@ export default class DemoApi {
   // 获取客户getKehuList
   // /bi-api/report/dataapi/customerinfo_api
   static getKehuList(data): Promise<BaseResponse<UserInfo>> {
+    const datas = { ...getTime, ...data };
     return http
       .server()
       .get(
         'bi-api/report/dataapi/customerinfo_api' +
-          `?${Object.keys(data)
+          `?${Object.keys(datas)
             .map((key) => {
-              return `${key}=${data[key]}`;
+              return `${key}=${datas[key]}`;
             })
             .join('&')}`
       )
@@ -207,4 +208,88 @@ export default class DemoApi {
         return res.data;
       });
   }
+  // 获取提油人 report/dataapi/driverleader_api
+  static getTiYouRen(): Promise<BaseResponse<Chanel[]>> {
+    const data = { ...getTime };
+    return http
+      .server()
+      .get(
+        'bi-api/report/dataapi/driverleader_api' +
+          `?${Object.keys(data)
+            .map((key) => {
+              return `${key}=${data[key]}`;
+            })
+            .join('&')}`
+      )
+      .then((res) => {
+        return res.data;
+      });
+  }
+  // 获取提油人负责项目bi-api/report/dataapi/teamleader_api?
+  static getTiYouRenProject(data): Promise<BaseResponse<Chanel[]>> {
+    const datas = { ...getTime, ...data };
+    return http
+      .server()
+      .get(
+        'bi-api/report/dataapi/teamleader_api' +
+          `?${Object.keys(datas)
+            .map((key) => {
+              return `${key}=${datas[key]}`;
+            })
+            .join('&')}`
+      )
+      .then((res) => {
+        return res.data;
+      });
+  }
+
+  // 获取所有项目信息 bi-api/report/dataapi/onlybuyinfo_api
+  static getProjectInfo(): Promise<BaseResponse<Chanel[]>> {
+    return http
+      .server()
+      .get(
+        'bi-api/report/dataapi/onlybuyinfo_api' +
+          `?${Object.keys(getTime)
+            .map((key) => {
+              return `${key}=${getTime[key]}`;
+            })
+            .join('&')}`
+      )
+      .then((res) => {
+        return res.data;
+      });
+  }
+  // bi-api/report/dataapi/driverinfo 获取指定司机负责项目
+  static getDriverInfo(data): Promise<BaseResponse<Chanel[]>> {
+    const datas = { ...getTime, ...data };
+    return http
+      .server()
+      .get(
+        'bi-api/report/dataapi/driverinfo' +
+          `?${Object.keys(datas)
+            .map((key) => {
+              return `${key}=${datas[key]}`;
+            })
+            .join('&')}`
+      )
+      .then((res) => {
+        return res.data;
+      });
+  }
+  // bi-api/report/dataapi/driverinfo1_api获取所有司机信息
+  static getDriverAllInfo(): Promise<BaseResponse<Chanel[]>> {
+    return http
+      .server()
+      .get(
+        'bi-api/report/dataapi/driverinfo1_api' +
+          `?${Object.keys(getTime)
+            .map((key) => {
+              return `${key}=${getTime[key]}`;
+            })
+            .join('&')}`
+      )
+      .then((res) => {
+        return res.data;
+      });
+  }
 }

+ 44 - 0
src/pages.json

@@ -165,7 +165,51 @@
         "navigationStyle": "default",
         "navigationBarTitleText": "详情"
       }
+    },
+    // pages/takeOil/list 提油管理
+    {
+      "path": "pages/takeOil/list",
+      "style": {
+        "navigationStyle": "default",
+        "navigationBarTitleText": "提油管理"
+      }
+    },
+    {
+      "path": "pages/takeOil/detail",
+      "style": {
+        "navigationStyle": "default",
+        "navigationBarTitleText": "详情"
+      }
+    },
+    {
+      "path": "pages/takeOil/form",
+      "style": {
+        "navigationStyle": "default",
+        "navigationBarTitleText": "提油管理"
+      }
+    },
+    {
+      "path": "pages/refuel/list",
+      "style": {
+        "navigationStyle": "default",
+        "navigationBarTitleText": "提油管理"
+      }
+    },
+    {
+      "path": "pages/refuel/detail",
+      "style": {
+        "navigationStyle": "default",
+        "navigationBarTitleText": "详情"
+      }
+    },
+    {
+      "path": "pages/refuel/form",
+      "style": {
+        "navigationStyle": "default",
+        "navigationBarTitleText": "提油管理"
+      }
     }
+
   ],
   "tabBar": {
     "custom": true,

+ 4 - 0
src/pages/home/Home.vue

@@ -16,6 +16,10 @@
           <template>
             <wd-cell title="采购管理" is-link icon="edit" to="/pages/procure/list" />
             <wd-cell title="结算管理" is-link icon="spool" to="/pages/settlement/list" />
+            <!-- 提油管理 -->
+            <wd-cell title="提油管理" is-link icon="location" to="/pages/takeOil/list" />
+            <!--加油管理  -->
+            <wd-cell title="加油管理" is-link icon="location" to="/pages/refuel/list" />
             <wd-cell title="回款打款管理" is-link icon="spool" to="/pages/payment/list" />
             <wd-cell title="项目-油品信息管理" is-link icon="location" to="/pages/oils/list" />
           </template>

+ 4 - 1
src/pages/oils/detail.vue

@@ -1,7 +1,10 @@
 <template>
   <view class="view">
     <wd-cell-group border>
-      <wd-cell v-for="(item, i) in list" :title="item.fieldName" :value="item.value" />
+      <template v-for="(item, i) in list">
+        <wd-cell v-if="item.fieldName !== '送油单价'" :title="item.fieldName" :value="item.value" />
+        <wd-cell v-else :title="'吨单价'" :value="item.value" />
+      </template>
     </wd-cell-group>
   </view>
 </template>

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

@@ -70,11 +70,28 @@
         <!-- 送油单价 406 -->
         <wd-input
           v-model="dataForm[406]"
-          :label="'送油单价'"
+          :label="'单价'"
           :prop="'406'"
           :placeholder="'请输入送油单价'"
           type="digit"
         />
+        <!-- 升单价 -->
+        <wd-input
+          v-model="dataForm[892]"
+          :label="'升单价'"
+          :prop="'892'"
+          :placeholder="'请输入送油单价'"
+          type="digit"
+        />
+        <!-- 结算单位 吨或者升 -->
+        <wd-cell prop="891" title="结算单位" center  title-width="100px">
+          <view style="text-align: left">
+            <wd-radio-group v-model="dataForm[891]" inline cell>
+              <wd-radio :value="'吨'">吨</wd-radio>
+              <wd-radio :value="'升'">升</wd-radio>
+            </wd-radio-group>
+          </view>
+        </wd-cell>
       </wd-cell-group>
       <view class="footer">
         <wd-button type="primary" size="large" block @click="handleSubmit">提交</wd-button>
@@ -115,6 +132,7 @@ const rules = ref({
     { required: true, message: '密度未填写' },
     { pattern: /^\d+(\.\d+)?$/, message: '请输入数字', trigger: 'blur' },
   ],
+  891: [{ required: true, message: '结算单位未填写' }],
 });
 function init() {
   DemoApi.getConfig(formKey.value).then((res) => {

+ 54 - 0
src/pages/refuel/detail.vue

@@ -0,0 +1,54 @@
+<template>
+  <view class="view">
+    <wd-cell-group border>
+      <template v-for="(item, i) in list">
+        <!-- 如果是图片 -->
+        <!-- field: "COL_13" -->
+        <view v-if="item.field === 'COL_19' && item.value">
+          <wd-cell :title="item.fieldName">
+            <!-- 图片 -->
+          </wd-cell>
+          <view class="img-list">
+            <wd-img :width="100" :height="100" v-for="(img, index) in item.value" :src="img.url" />
+          </view>
+        </view>
+        <wd-cell v-else :title="item.fieldName" :value="item.value" />
+      </template>
+    </wd-cell-group>
+  </view>
+</template>
+<script lang="ts" setup>
+import config from '@/http/config';
+const list = ref([]);
+const filedsData = ref({});
+onLoad((options) => {
+  filedsData.value = JSON.parse(options.filedsData);
+  // 删除id
+  if (filedsData.value.id) {
+    delete filedsData.value.id;
+  }
+  list.value = Object.values(filedsData.value);
+  // 如果是图片
+  if (list.value.length > 0) {
+    list.value.forEach((item) => {
+      if (item.field === 'COL_19' && item.value) {
+        item.value = JSON.parse(item.value);
+        item.value.forEach((img) => {
+          img.url = config.baseURL + img.url;
+        });
+      }
+    });
+  }
+});
+</script>
+<style lang="scss" scoped>
+.img-list {
+  display: flex;
+  flex-wrap: wrap;
+  padding: 10px;
+  :deep .wd-img + .wd-img {
+    margin-left: 10px;
+    margin-bottom: 10px;
+  }
+}
+</style>

+ 623 - 0
src/pages/refuel/form.vue

@@ -0,0 +1,623 @@
+<template>
+  <view class="settlement-form">
+    <wd-form ref="form" :model="dataForm" :rules="rules">
+      <wd-cell-group>
+        <!--加油日期615 司机名称623 项目名称622 客户名称620
+            油品名称616 油品型号617 单位782 数量升633
+            结算状态736 1已结算,0未结算 加油单据631 折算吨635
+            油品密度634
+            加油单价(送油 618 加油金额619 项目编号621
+            司机手机号码627 队长名称624 队长手机号码628 经度625
+            维度626 提交日期629 最后修改日期630 -->
+        <wd-calendar
+          v-model="dataForm[615]"
+          label="加油日期"
+          :prop="'615'"
+          placeholder="请选择提油日期"
+          type="date"
+        />
+        <!-- 提油人 -->
+        <wd-select-picker
+          v-model="dataForm[623]"
+          :columns="userList"
+          label="司机名称"
+          :prop="'623'"
+          placeholder="请选择司机名称"
+          type="radio"
+          @change="onUserChange"
+        />
+
+        <!-- 项目名称 -->
+        <wd-select-picker
+          v-model="dataForm[622]"
+          :columns="userProject"
+          label="项目名称"
+          :prop="'622'"
+          placeholder="请选择项目名称"
+          :disabled="dataForm[623] ? false : true"
+          @change="projectNameChange"
+          type="radio"
+        />
+        <!-- 客户名称 -->
+        <wd-select-picker
+          v-model="dataForm[620]"
+          :columns="kehuList"
+          label="客户名称"
+          :prop="'620'"
+          placeholder="请选择客户名称"
+          type="radio"
+        />
+
+        <wd-select-picker
+          v-if="dataForm[621]"
+          v-model="dataForm[616]"
+          :columns="oilList"
+          label="油品名称"
+          :prop="'616'"
+          placeholder="请选择油品名称"
+          type="radio"
+          @change="ypNameChange"
+        />
+        <!-- 油品型号 617 -->
+        <wd-select-picker
+          v-model="dataForm[617]"
+          :columns="oilTypeList"
+          label="油品型号"
+          :prop="'617'"
+          placeholder="请选择油品型号"
+          type="radio"
+          @change="oilTypeChange"
+          v-if="dataForm[616] && dataForm[621]"
+        />
+        <!-- 单位782 吨或者升 -->
+        <wd-cell prop="782" title="单位" center title-width="100px">
+          <view style="text-align: left">
+            <wd-radio-group v-model="dataForm[782]" inline cell @change="dwChange">
+              <wd-radio :value="'吨'">吨</wd-radio>
+              <wd-radio :value="'升'">升</wd-radio>
+            </wd-radio-group>
+          </view>
+        </wd-cell>
+        <!-- 数量升 -->
+        <wd-cell prop="633" title="数量升" center title-width="100px">
+          <view style="text-align: left">
+            <wd-input-number
+              v-model="dataForm[633]"
+              :placeholder="'请输入升'"
+              :min="0"
+              :precision="4"
+              @change="onChangeL"
+            />
+          </view>
+        </wd-cell>
+        <!-- 736 结算状态 -->
+        <wd-cell prop="736" title="结算状态" center title-width="100px">
+          <view style="text-align: left">
+            <wd-radio-group v-model="dataForm[736]" inline cell>
+              <wd-radio :value="0">未结算</wd-radio>
+              <wd-radio :value="1">已结算</wd-radio>
+            </wd-radio-group>
+          </view>
+        </wd-cell>
+
+        <!-- 单据照片 631 -->
+        <wd-cell :title="'加油单据'" title-width="120rpx" :prop="'631'">
+          <wd-upload
+            :file-list="dataForm[631]"
+            :action="config.baseURL + 'api/file/uploadFile'"
+            @change="handleChangeFile"
+          />
+        </wd-cell>
+
+        <!-- 折算吨 635 -->
+        <wd-input
+          v-model="dataForm[635]"
+          :placeholder="'请输入折算吨'"
+          :label="'折算吨'"
+          prop="635"
+          :disabled="true"
+        />
+        <!-- 油品密度 634 -->
+        <wd-input
+          v-model="dataForm[634]"
+          :placeholder="'请输入油品密度'"
+          :label="'油品密度'"
+          prop="634"
+          :disabled="true"
+        />
+        <!-- 加油单价 只能输入数字-->
+        <wd-input
+          v-model="dataForm[618]"
+          :placeholder="'请输入加油单价'"
+          :label="'加油单价'"
+          prop="618"
+          type="digit"
+          @blur="onChangeL"
+        />
+
+        <!-- 加油金额 619 -->
+        <wd-input
+          v-model="dataForm[619]"
+          :placeholder="'请输入加油金额'"
+          :label="'加油金额'"
+          prop="619"
+          type="digit"
+          @blur="onChangeL"
+        />
+
+        <!-- 项目编号 -->
+        <wd-input
+          v-model="dataForm[621]"
+          :placeholder="'请输入项目编号'"
+          :label="'项目编号'"
+          prop="621"
+          :disabled="true"
+        />
+        <!-- 司机手机号码 -->
+        <wd-input
+          v-model="dataForm[627]"
+          :placeholder="'请输入司机手机号码'"
+          :label="'司机手机号码'"
+          prop="627"
+          :disabled="true"
+        />
+        <!-- 队长名称 -->
+        <wd-input
+          v-model="dataForm[624]"
+          :placeholder="'请输入队长名称'"
+          :label="'队长名称'"
+          prop="624"
+          :disabled="true"
+        />
+        <!-- 队长手机号码 -->
+        <wd-input
+          v-model="dataForm[628]"
+          :placeholder="'请输入队长手机号码'"
+          :label="'队长手机号码'"
+          prop="628"
+          :disabled="true"
+        />
+        <!-- 经纬度 -->
+        <wd-input
+          v-model="dataForm[625]"
+          :placeholder="'请输入经度'"
+          :label="'经度'"
+          prop="625"
+          :disabled="true"
+        />
+        <wd-input
+          v-model="dataForm[626]"
+          :placeholder="'请输入维度'"
+          :label="'维度'"
+          prop="626"
+          :disabled="true"
+        />
+        <wd-calendar
+          v-model="dataForm[629]"
+          label="提交日期"
+          :prop="'629'"
+          placeholder="请选择提交日期"
+          type="date"
+          :disabled="true"
+        />
+        <wd-calendar
+          v-model="dataForm[630]"
+          label="最后修改日期"
+          :prop="'630'"
+          placeholder="请选择最后修改日期"
+          type="date"
+          :disabled="true"
+        />
+      </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 config from '@/http/config';
+import { useToast } from 'wot-design-uni';
+
+const formKey = ref<string>('');
+const id = ref<string>('');
+const filedsData = ref<Object>([]);
+onLoad((option) => {
+  formKey.value = option.formKey;
+  filedsData.value = JSON.parse(option.filedsData || '{}');
+  // 过滤8开头的字段
+  filedsData.value = Object.keys(filedsData.value).reduce((obj, key) => {
+    if (key[0] !== '8') {
+      obj[key] = filedsData.value[key];
+    }
+    return obj;
+  }, {});
+  id.value = filedsData.value.id;
+  init();
+});
+const toast = useToast();
+
+const formDataSet = ref({});
+const dataForm = ref({});
+const rules = ref({
+  //单位
+  782: [{ required: true, message: '单位未填写' }],
+});
+const showFormList = ref(1);
+function init() {
+  toast.loading('加载中...')
+  DemoApi.getConfig(formKey.value).then((res) => {
+    formDataSet.value = JSON.parse(res.data.formData || '{}');
+    const obj = {};
+    const objAllSet = {};
+    formDataSet.value.fields.map((item) => {
+      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__] = [
+          { required: true, message: item.__config__.label + '未填写' },
+        ];
+      }
+    });
+
+    Object.keys(filedsData.value).map((key) => {
+      Object.values(filedsData.value).map((item) => {
+        if (parseInt(item.fieldId) === parseInt(key)) {
+          obj[key] = item.value;
+        }
+      });
+      if (objAllSet[key] === 'date') {
+        // 2024-03-12转化成时间戳
+        if (obj[key] != null && obj[key].indexOf('-') > -1) {
+          obj[key] = new Date(obj[key]).getTime();
+        }
+      }
+      if (objAllSet[key] === 'uploadImg') {
+        // 如果返回字符串长度大于3则转成数组
+        if (obj[key] != null && obj[key].indexOf('[') > -1) {
+          obj[key] = JSON.parse(obj[key]);
+          obj[key] = obj[key].map((item) => {
+            return {
+              url: config.baseURL + item.url,
+              name: item.name,
+              fileld: item.fileld,
+            };
+          });
+        } else {
+          obj[key] = [];
+        }
+      }
+    });
+    dataForm.value = obj;
+    // 提交日期如果没有值则赋值
+    if (!dataForm.value[629]) {
+      dataForm.value[629] = new Date(new Date().toLocaleDateString()).getTime();
+    }
+    // 最后修改日期赋值当前时间
+    dataForm.value[630] = new Date().getTime();
+    oldFormData.value = JSON.stringify(obj);
+    baseSelectData();
+    toast.close();
+  });
+}
+
+const oilList = ref([
+  // 柴油 汽油
+  { label: '柴油', value: '柴油' },
+  { label: '汽油', value: '汽油' },
+]);
+
+const oilTypeList = ref([]);
+function initOilTypeList() {
+  let params = {
+    // 项目名称 油品名称
+    projectid: dataForm.value[621],
+    ypmc: dataForm.value[616],
+  };
+  DemoApi.getOilTypeList(params).then((res) => {
+    oilTypeList.value = res.data.map((item) => {
+      return {
+        label: item.油品型号,
+        value: item.油品型号,
+        md: item.合同定油品密度,
+        dj: item.加油单价,
+      };
+    });
+  });
+}
+function oilTypeChange({ value }) {
+  dataForm.value[617] = value;
+  dataForm.value[634] = oilTypeList.value.find((item) => item.value === value).md;
+  // 加油单价
+  dataForm.value[618] = oilTypeList.value.find((item) => item.value === value).dj;
+}
+function ypNameChange({ value }) {
+  dataForm.value[616] = value;
+  initOilTypeList();
+}
+// 升变化 根据密度和升计算吨
+function onChangeL() {
+  dwChange();
+  // 根据折算吨 和 加油单价 计算加油金额
+  if (dataForm.value[633] && dataForm.value[618]) {
+    dataForm.value[619] = dataForm.value[633] * dataForm.value[618];
+  }
+}
+function dwChange() {
+  // 单位变化 根据数量升 油品密度进行换算 折算吨
+  const type = dataForm.value[782];
+  if (type === '吨') {
+    dataForm.value[635] = dataForm.value[633];
+  } else if (type === '升') {
+    dataForm.value[635] = (
+      ((dataForm.value[633] || 0) * (dataForm.value[634] || 0)) /
+      1000
+    ).toFixed(4);
+  }
+}
+// 上传
+function handleChangeFile({ fileList }) {
+  // 如果不是数组
+  const arr = [];
+  if (!Array.isArray(fileList)) {
+    fileList = [];
+  }
+  for (let i = 0; i < fileList.length; i++) {
+    const val = fileList[i];
+    if (val.response) {
+      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);
+      }
+    } else {
+      const oldData = {
+        url: val.url,
+        name: val.name,
+        fileld: val.fileld,
+      };
+
+      arr.push(oldData);
+    }
+  }
+  dataForm.value[631] = arr;
+}
+
+const userList = ref([]);
+// 获取提油人
+function getUserList() {
+  DemoApi.getDriverAllInfo().then((res) => {
+    userList.value = res.data.map((item) => {
+      return {
+        label: item.司机姓名,
+        value: item.司机姓名,
+        phone: item.手机号,
+      };
+    });
+  });
+}
+getUserList();
+const userProject = ref([]);
+// 获取全部项目
+function onUserChange({ value }) {
+  dataForm.value[623] = value;
+  dataForm.value[627] = userList.value.find((item) => item.value === value).phone;
+  // 获取全部项目
+  DemoApi.getDriverInfo({
+    driverleader: dataForm.value[623],
+  }).then((res) => {
+    userProject.value = res.data.map((item) => {
+      return {
+        label: item.复杂项目名称,
+        value: item.复杂项目名称,
+        code: item.项目编号,
+        // 队长名
+        name: item.队长名称,
+        // 队长手机号
+        phone: item.队长手机号,
+      };
+    });
+  });
+}
+// 初始化必要信息
+function baseSelectData() {
+  DemoApi.getDriverInfo({
+    drivername: dataForm.value[623],
+  }).then((res) => {
+    userProject.value = res.data.map((item) => {
+      return {
+        label: item.复杂项目名称,
+        value: item.复杂项目名称,
+        code: item.项目编号,
+        // 队长名
+        name: item.队长名称,
+        // 队长手机号
+        phone: item.队长手机号,
+      };
+    });
+  });
+  // 获取客户名称
+  getKehuLists();
+  initOilTypeList();
+}
+// 负责的项目
+// 所有项目
+const allProject = ref([]);
+function getPriceList() {
+  DemoApi.getProjectInfo().then((res) => {
+    // 过滤所有
+    allProject.value = res.data.map((item) => {
+      return {
+        label: item.项目名称,
+        value: item.项目名称,
+      };
+    });
+  });
+}
+getPriceList();
+
+function projectNameChange({ value }) {
+  dataForm.value[622] = value;
+  // 621
+  dataForm.value[621] = userProject.value.find((item) => item.value === value).code;
+  // 队长名
+  dataForm.value[624] = userProject.value.find((item) => item.value === value).name;
+  // 队长手机号
+  dataForm.value[628] = userProject.value.find((item) => item.value === value).phone;
+  // 获取客户名称
+  getKehuLists();
+}
+function getInvoiceCompanyLists({ value }) {
+  dataForm.value[641] = value;
+  // 采购单名称647 采购单价655 采购金额656 付款单位624 收款单位643
+  const find = allProject.value.find((item) => item.采购单号 === value);
+  dataForm.value[647] = find.采购单名称;
+  dataForm.value[655] = find.采购单价;
+  dataForm.value[656] = find.采购金额;
+  dataForm.value[624] = find.付款单位;
+  dataForm.value[643] = find.收款单位;
+}
+// 获取客户kehuList
+const kehuList = ref([]);
+function getKehuLists() {
+  DemoApi.getKehuList({
+    // 项目编号
+    projectid: dataForm.value[621],
+  }).then((res) => {
+    kehuList.value = res.data.map((item) => {
+      return {
+        label: item.客户名称,
+        value: item.客户名称,
+      };
+    });
+    if (dataForm.value[620] && !kehuList.value.some((item) => item.value === dataForm.value[620])) {
+      kehuList.value.push({
+        label: dataForm.value[620],
+        value: dataForm.value[620],
+      });
+    }
+  });
+}
+// 是否发票
+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[631] = dataForm.value[631].map((item) => {
+          return {
+            name: item.name,
+            fileld: item.fileld,
+            url: item.fileld,
+          };
+        });
+        let paramsData = {};
+        // 过滤所有空值 为空字符 或者 null 或者 空数组
+        // 不能为8开头
+        const paramsFiled = Object.keys(dataForm.value)
+          .map((key) => key.toString())
+          .filter((item) => item[0] !== '8');
+        paramsFiled.map((key) => {
+          if (
+            dataForm.value[key] !== '' &&
+            dataForm.value[key] !== null &&
+            dataForm.value[key]?.length !== 0
+          ) {
+            paramsData[key] = dataForm.value[key];
+          }
+        });
+        const params = {
+          id: id.value ? '/' + id.value : '',
+          formKey: formKey.value,
+          data: [
+            {
+              data: JSON.stringify(paramsData),
+              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[631] = dataForm.value[631].map((item) => {
+              return {
+                name: item.name,
+                fileld: item.fileld,
+                url: config.baseURL + item.fileld,
+              };
+            });
+
+            if (res.code === 200) {
+              toast.success('更新成功');
+              // 如果res.data是数组则提示新增成功
+              setTimeout(() => {
+                uni.redirectTo({
+                  url: '/pages/takeOil/list',
+                });
+              }, 3000);
+            } else {
+              toast.error('提交失败');
+            }
+          });
+        } else {
+          DemoApi.getAddData(params).then((res) => {
+            toast.close();
+            dataForm.value[631] = dataForm.value[631].map((item) => {
+              return {
+                name: item.name,
+                fileld: item.fileld,
+                url: config.baseURL + item.fileld,
+              };
+            });
+
+            if (res.code === 200) {
+              // 如果res.data是数组则提示新增成功
+              toast.success('新增成功');
+              // 返回上一页
+              // 三秒后返回上一页
+              setTimeout(() => {
+                uni.redirectTo({
+                  url: '/pages/takeOil/list',
+                });
+              }, 3000);
+            } else {
+              toast.error('提交失败');
+            }
+          });
+        }
+      }
+    })
+    .catch((error) => {
+      console.log(error, 'error');
+    });
+}
+</script>
+<style lang="scss" scoped>
+.footer {
+  padding-bottom: 20px;
+}
+</style>

+ 426 - 0
src/pages/refuel/list.vue

@@ -0,0 +1,426 @@
+<template>
+  <view class="settlement-form">
+    <view class="search-view">
+      <wd-search
+        v-model="value"
+        cancel-txt="搜索"
+        @change="searchChange"
+        @cancel="cancelChange"
+        @focus="searchFocus"
+      >
+        <template #prefix>
+          <wd-popover v-model="show" mode="menu" :content="menu" @menuclick="changeSearchType">
+            <view class="search-type">
+              <text>{{ searchType }}</text>
+              <wd-icon custom-class="icon-arrow" name="fill-arrow-down" />
+            </view>
+          </wd-popover>
+        </template>
+      </wd-search>
+    </view>
+
+    <wd-action-sheet
+      v-model="showSheet"
+      :title="searchType"
+      :actions="actions"
+      @close="close"
+      @select="select"
+    />
+
+    <template v-for="(item, index) in settlementList" :key="index">
+      <wd-card :title="'项目编号:' + item[615].value">
+        <view class="project-body" @click="goDetail(item)">
+          <view class="body-list" v-for="(field, i) in showListField" :key="i">
+            <view>{{ field.content }}: {{ item[field.field].value }}</view>
+          </view>
+        </view>
+        <template #footer>
+          <wd-button size="small" type="warning" @click="goDetail(item)">查看详情</wd-button>
+          <wd-button size="small" @click="goEdit(item)">编辑</wd-button>
+          <wd-button size="small" type="error" @click="deleteData(item)">删除</wd-button>
+        </template>
+      </wd-card>
+    </template>
+    <wd-loadmore custom-class="loadmore" :state="loadState" />
+  </view>
+  <!-- <view class="addbtn">
+    <wd-button block type="primary" @click="addData">新增</wd-button>
+  </view> -->
+  <wd-toast />
+  <wd-message-box />
+</template>
+<script setup lang="ts">
+import DemoApi from '@/api/DemoApi';
+import router from '@/router';
+import config from '@/http/config';
+import { ref } from 'vue';
+import { useToast, useMessage } from 'wot-design-uni';
+const message = useMessage();
+const show = ref<boolean>(false);
+const searchType = ref<string>('项目名称');
+const value = ref<string>('');
+const loadState = ref('loading');
+const menu = ref([
+  {
+    content: '项目名称',
+    filedName: 'projectName',
+  },
+]);
+const showListField = ref([
+  {
+    content: '项目名称',
+    field: 622,
+  },
+  {
+    content: '油品名称',
+    field: 616,
+  }, // 油品型号
+  {
+    content: '油品型号',
+    field: 617,
+  }, // 合同定油品密度 6
+  {
+    content: '油品密度',
+    field: 634,
+  },
+]);
+const showSheet = ref<boolean>(false);
+function changeSearchType({ item, index }) {
+  searchType.value = item.content;
+  show.value = false;
+  showSheet.value = true;
+  if (index === 0) {
+    actions.value = projectList.value;
+  } else if (index === 1) {
+    actions.value = oilList.value;
+  } else if (index === 2) {
+    actions.value = userList.value;
+  }
+}
+function searchFocus() {
+  const keyStop = () => {
+    var interval = setInterval(function () {
+      uni.hideKeyboard(); //隐藏软键盘
+    }, 20);
+    setTimeout(() => {
+      clearInterval(interval);
+    }, 3000);
+  };
+  keyStop();
+  uni.hideKeyboard();
+  showSheet.value = true;
+}
+function searchChange(value) {
+  // 如果输入框为空则清空 searchForm
+  if (!value.value) {
+    searchForm.value = {
+      projectName: '',
+      oilName: '',
+      customerName: '',
+    };
+    getSettlementList('reset');
+  }
+}
+// cancelChange
+function cancelChange(value) {
+  getSettlementList('reset');
+}
+const actions = ref([]);
+// 油品名称
+const oilList = ref([{ name: '柴油' }, { name: '汽油' }]);
+// 客户名称
+const userList = ref([]);
+// 获取客户列表
+const getUserList = () => {
+  DemoApi.getCustomerList().then((res) => {
+    userList.value = res.data.map((item) => {
+      return { name: item.COL_ALIAS_1 };
+    });
+  });
+};
+getUserList();
+
+const projectList = ref([]);
+const getProjectList = () => {
+  // 获取项目列表
+  DemoApi.getProjectNameList().then((res) => {
+    projectList.value = res.data.map((item) => {
+      return { name: item.项目名称 };
+    });
+    actions.value = projectList.value;
+  });
+};
+getProjectList();
+onLoad(() => {
+  getSettlementList();
+});
+function close() {
+  showSheet.value = false;
+}
+const searchForm = ref({
+  projectName: '',
+  oilName: '',
+  customerName: '',
+});
+const toast = useToast();
+
+function select({ item, index }) {
+  showSheet.value = false;
+  if (searchType.value === '项目名称') {
+    searchForm.value.projectName = item.name;
+  } else if (searchType.value === '油品名称') {
+    searchForm.value.oilName = item.name;
+  } else if (searchType.value === '客户名称') {
+    searchForm.value.customerName = item.name;
+  }
+  value.value = item.name;
+}
+// 分页数据
+const pageQuery = ref({
+  current: 1,
+  size: 20,
+  descs: 536,
+  total: 0,
+});
+
+// 下拉刷新
+onPullDownRefresh(() => {
+  getSettlementList('reset');
+});
+// 上拉加载
+onReachBottom(() => {
+  console.log('上拉加载');
+  if (pageQuery.value.current * pageQuery.value.size < pageQuery.value.total) {
+    pageQuery.value.current++;
+    getSettlementList();
+  }
+});
+// 获取结算管理列表
+const formKey = ref<string>('7164c3e7895f49fd0c4e2742e81cb726');
+const idKeyData = ref<string>('');
+const settlementList = ref([]);
+const tableData = ref([]);
+const getSettlementList = (setparams) => {
+  // finished
+  loadState.value = 'loading';
+  if (setparams === 'reset') {
+    // 页码归于1
+    pageQuery.value.current = 1;
+  }
+  DemoApi.getConfig(formKey.value).then((res) => {
+    const { dbLinkId, idKey } = res.data;
+    idKeyData.value = idKey;
+    tableData.value = JSON.parse(res.data.tables || '[]');
+    // 匹配fieldName == menu name的值 并且再menu添加 fieldId
+    menu.value.map((item) => {
+      tableData.value.map((table) => {
+        if (table.fieldName === item.content) {
+          item.fieldId = table.fieldId;
+        }
+      });
+    });
+    const params = {
+      dbLinkId,
+      pageQuery: pageQuery.value,
+      paramList: [],
+    };
+    pageQuery.value.descs = JSON.parse(res.data.columnData || '{}')?.defaultSidx;
+    menu.value.map((item) => {
+      const obj = {
+        cubeColumnId: item.fieldId,
+        function: 'in',
+        values: [],
+      };
+      if (searchForm.value[item.filedName]) {
+        obj.values.push(searchForm.value[item.filedName]);
+      }
+      params.paramList.push(obj);
+    });
+
+    DemoApi.getFormDataList(params).then((resp) => {
+      const { columnDict, pageData } = resp.data;
+      pageQuery.value.total = pageData.total;
+      pageQuery.value.current = pageData.current;
+      pageQuery.value.size = pageData.size;
+      // columnDict 是 pageData.records 和 tableData 的映射关系
+      // columnDict的key是tableData的fieldId,value是pageData.records的 key
+      // pageData.records 是后台返回的数据
+      // tableData 是前台配置的表头
+      const idKey = columnDict[idKeyData.value];
+      const arr = [];
+      pageData.records.map((val) => {
+        const obj = {};
+        obj.id = val[idKey];
+        for (const key in columnDict) {
+          tableData.value.map((item) => {
+            if (item.fieldId + '' === key + '') {
+              // obj[item.field] = val[columnDict[key]];
+              obj[item.fieldId] = {
+                value: val[columnDict[key]],
+                field: item.field,
+                fieldName: item.fieldName,
+                fieldId: item.fieldId,
+                pageDataRecordKey: columnDict[key],
+              };
+            }
+          });
+        }
+        arr.push(obj);
+      });
+      if (setparams === 'reset') {
+        settlementList.value = arr;
+      } else {
+        settlementList.value = settlementList.value.concat(arr);
+      }
+      loadState.value = 'finished';
+      // 关闭下拉刷新
+      uni.stopPullDownRefresh();
+      // 回到顶部
+    });
+  });
+};
+
+function goEdit(item) {
+  router.push({
+    path: 'pages/refuel/form',
+    query: { filedsData: JSON.stringify(item || '[]'), formKey: formKey.value },
+  });
+}
+function addData() {
+  router.push({
+    path: 'pages/refuel/form',
+    query: { filedsData: '[]', formKey: formKey.value },
+  });
+}
+// goDetail 去往详情页
+function goDetail(item) {
+  router.push({
+    path: 'pages/refuel/detail',
+    query: { filedsData: JSON.stringify(item || '[]'), 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('reset');
+        },
+      });
+    });
+}
+</script>
+
+<style lang="scss" scoped>
+.search-type {
+  position: relative;
+  height: 30px;
+  line-height: 30px;
+  padding: 0 8px 0 16px;
+}
+.search-type::after {
+  position: absolute;
+  content: '';
+  width: 1px;
+  right: 0;
+  top: 5px;
+  bottom: 5px;
+  background: rgba(0, 0, 0, 0.25);
+}
+.search-type {
+  :deep(.icon-arrow) {
+    display: inline-block;
+    font-size: 20px;
+    vertical-align: middle;
+  }
+}
+// 固定底部
+.pagination {
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  z-index: 1;
+}
+.settlement-form {
+  padding-top: 130rpx;
+  min-height: calc(100vh - var(--window-top) - var(--window-bottom));
+  width: 100vw;
+  box-sizing: border-box;
+  background: #f1f1f1;
+  position: relative;
+}
+// 固定到顶部
+.search-view {
+  position: fixed;
+  top: 0;
+  left: 0;
+  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;
+  }
+}
+.addbtn {
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  padding: 20px;
+  box-sizing: border-box;
+}
+.project-body {
+  display: flex;
+  flex-direction: column;
+  .body-list {
+    .list-item {
+      display: flex;
+      justify-content: space-between;
+      .item-left {
+        width: 30%;
+      }
+      .item-right {
+        flex: 1;
+        text-align: right;
+      }
+    }
+  }
+}
+.settlement-form {
+  :deep .wd-button + .wd-button {
+    margin-left: 20rpx;
+  }
+}
+</style>

+ 54 - 0
src/pages/takeOil/detail.vue

@@ -0,0 +1,54 @@
+<template>
+  <view class="view">
+    <wd-cell-group border>
+      <template v-for="(item, i) in list">
+        <!-- 如果是图片 -->
+        <!-- field: "COL_13" -->
+        <view v-if="item.field === 'COL_15' && item.value">
+          <wd-cell :title="item.fieldName">
+            <!-- 图片 -->
+          </wd-cell>
+          <view class="img-list">
+            <wd-img :width="100" :height="100" v-for="(img, index) in item.value" :src="img.url" />
+          </view>
+        </view>
+        <wd-cell v-else :title="item.fieldName" :value="item.value" />
+      </template>
+    </wd-cell-group>
+  </view>
+</template>
+<script lang="ts" setup>
+import config from '@/http/config';
+const list = ref([]);
+const filedsData = ref({});
+onLoad((options) => {
+  filedsData.value = JSON.parse(options.filedsData);
+  // 删除id
+  if (filedsData.value.id) {
+    delete filedsData.value.id;
+  }
+  list.value = Object.values(filedsData.value);
+  // 如果是图片
+  if (list.value.length > 0) {
+    list.value.forEach((item) => {
+      if (item.field === 'COL_15' && item.value) {
+        item.value = JSON.parse(item.value);
+        item.value.forEach((img) => {
+          img.url = config.baseURL + img.url;
+        });
+      }
+    });
+  }
+});
+</script>
+<style lang="scss" scoped>
+.img-list {
+  display: flex;
+  flex-wrap: wrap;
+  padding: 10px;
+  :deep .wd-img + .wd-img {
+    margin-left: 10px;
+    margin-bottom: 10px;
+  }
+}
+</style>

+ 553 - 0
src/pages/takeOil/form.vue

@@ -0,0 +1,553 @@
+<template>
+  <view class="settlement-form">
+    <wd-form ref="form" :model="dataForm" :rules="rules">
+      <wd-cell-group>
+        <wd-calendar
+          v-model="dataForm[637]"
+          label="提油日期"
+          :prop="'637'"
+          placeholder="请选择提油日期"
+          type="date"
+        />
+        <!-- 提油人 -->
+        <wd-select-picker
+          v-model="dataForm[644]"
+          :columns="userList"
+          label="提油人"
+          :prop="'644'"
+          placeholder="请选择提油人"
+          type="radio"
+          @change="onUserChange"
+        />
+
+        <!-- 项目名称 -->
+        <wd-select-picker
+          v-model="dataForm[638]"
+          :columns="userProject"
+          label="项目名称"
+          :prop="'638'"
+          placeholder="请选择项目名称"
+          :disabled="dataForm[644] ? false : true"
+          @change="projectNameChange"
+          type="radio"
+        />
+        <!-- 采购单号 641 -->
+        <wd-select-picker
+          v-model="dataForm[641]"
+          :columns="allProject"
+          label="采购单号"
+          :prop="'641'"
+          placeholder="请选择采购单号"
+          type="radio"
+          @change="getInvoiceCompanyLists"
+        />
+        <!-- 采购单名称 -->
+        <wd-input
+          v-model="dataForm[647]"
+          :placeholder="'请输入采购单名称'"
+          :label="'采购单名称'"
+          prop="647"
+          :disabled="true"
+        />
+        <!-- 单位  781-->
+        <wd-cell prop="781" title="结算单位" center title-width="100px">
+          <view style="text-align: left">
+            <wd-radio-group v-model="dataForm[781]" inline cell>
+              <wd-radio :value="'吨'">吨</wd-radio>
+              <wd-radio :value="'升'">升</wd-radio>
+            </wd-radio-group>
+          </view>
+        </wd-cell>
+        <!-- 实际提油 654  数字最小为0-->
+        <wd-cell prop="654" title="实际提油" center title-width="100px">
+          <view style="text-align: left">
+            <wd-input-number
+              v-model="dataForm[654]"
+              :placeholder="'请输入实际提油'"
+              :min="0"
+              :precision="4"
+            />
+          </view>
+        </wd-cell>
+
+        <wd-select-picker
+          v-model="dataForm[639]"
+          :columns="oilList"
+          label="油品名称"
+          :prop="'639'"
+          placeholder="请选择油品名称"
+          type="radio"
+          @change="ypNameChange"
+        />
+        <!-- 油品型号 640 -->
+        <wd-select-picker
+          v-model="dataForm[640]"
+          :columns="oilTypeList"
+          label="油品型号"
+          :prop="'640'"
+          placeholder="请选择油品型号"
+          type="radio"
+          @change="oilTypeChange"
+          v-if="dataForm[639]"
+        />
+        <!-- 737 结算状态 -->
+        <wd-cell prop="737" title="结算状态" center title-width="100px">
+          <view style="text-align: left">
+            <wd-radio-group v-model="dataForm[737]" inline cell>
+              <wd-radio :value="0">未结算</wd-radio>
+              <wd-radio :value="1">已结算</wd-radio>
+            </wd-radio-group>
+          </view>
+        </wd-cell>
+        <!-- 单据照片 646 -->
+        <wd-cell :title="'单据照片'" title-width="100rpx" :prop="'646'">
+          <wd-upload
+            :file-list="dataForm[646]"
+            :action="config.baseURL + 'api/file/uploadFile'"
+            @change="handleChangeFile"
+          />
+        </wd-cell>
+        <!-- 密度657 折升658 采购单价 采购金额 付款单位 收款单位 车牌号645 提油人手机号码648 提交日期649 最后修改日期 650 项目编号 651-->
+
+        <wd-input
+          v-model="dataForm[657]"
+          prop="657"
+          :label="'密度'"
+          :placeholder="'请输入密度'"
+          :disabled="true"
+        />
+        <wd-cell prop="658" title="折升" center title-width="100px">
+          <view style="text-align: left">
+            <wd-input-number
+              v-model="dataForm[658]"
+              :placeholder="'请输入升'"
+              :min="0"
+              :precision="4"
+              :disable="true"
+            />
+          </view>
+        </wd-cell>
+        <!-- 单价 -->
+
+        <wd-input
+          v-model="dataForm[655]"
+          :placeholder="'请输入采购单价'"
+          :label="'采购单价'"
+          prop="655"
+          :disabled="true"
+        />
+        <wd-input
+          v-model="dataForm[656]"
+          :placeholder="'请输入采购金额'"
+          :label="'采购金额'"
+          prop="656"
+          :disabled="true"
+        />
+        <wd-input
+          v-model="dataForm[642]"
+          :placeholder="'请输入付款单位'"
+          :label="'付款单位'"
+          prop="642"
+          :disabled="true"
+        />
+        <wd-input
+          v-model="dataForm[643]"
+          :placeholder="'请输入收款单位'"
+          :label="'收款单位'"
+          prop="643"
+          :disabled="true"
+        />
+        <wd-input
+          v-model="dataForm[645]"
+          :placeholder="'请输入车牌号'"
+          :label="'车牌号'"
+          prop="645"
+          :disabled="true"
+        />
+        <wd-input
+          v-model="dataForm[648]"
+          :placeholder="'请输入提油人手机号码'"
+          :label="'提油人手机号码'"
+          prop="648"
+          :disabled="true"
+        />
+
+        <wd-calendar
+          v-model="dataForm[649]"
+          label="提交日期"
+          :prop="'649'"
+          placeholder="请选择提交日期"
+          type="date"
+          :disabled="true"
+        />
+        <wd-calendar
+          v-model="dataForm[650]"
+          label="最后修改日期"
+          :prop="'650'"
+          placeholder="请选择最后修改日期"
+          type="date"
+          :disabled="true"
+        />
+        <wd-input
+          v-model="dataForm[651]"
+          :placeholder="'请输入项目编号'"
+          :label="'项目编号'"
+          prop="651"
+          :disabled="true"
+        />
+      </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 config from '@/http/config';
+import { useToast } from 'wot-design-uni';
+
+const formKey = ref<string>('');
+const id = ref<string>('');
+const filedsData = ref<Object>([]);
+onLoad((option) => {
+  formKey.value = option.formKey;
+  filedsData.value = JSON.parse(option.filedsData || '{}');
+  id.value = filedsData.value.id;
+  init();
+});
+const toast = useToast();
+
+const formDataSet = ref({});
+const dataForm = ref({});
+const rules = ref({
+  //提油人 项目名称 单位 结算状态
+  644: [{ required: true, message: '提油人未填写' }],
+  638: [{ required: true, message: '项目名称未填写' }],
+  781: [{ required: true, message: '结算单位未填写' }],
+  737: [{ required: true, message: '结算状态未填写' }],});
+const showFormList = ref(1);
+function init() {
+  // 加载中
+  toast.loading('加载中...')
+  DemoApi.getConfig(formKey.value).then((res) => {
+    formDataSet.value = JSON.parse(res.data.formData || '{}');
+    const obj = {};
+    const objAllSet = {};
+    formDataSet.value.fields.map((item) => {
+      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__] = [
+          { required: true, message: item.__config__.label + '未填写' },
+        ];
+      }
+    });
+
+    Object.keys(filedsData.value).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();
+      }
+      if (objAllSet[key] === 'uploadImg') {
+        // 如果返回字符串长度大于3则转成数组
+        if (obj[key] != null && obj[key].indexOf('[') > -1) {
+          obj[key] = JSON.parse(obj[key]);
+          obj[key] = obj[key].map((item) => {
+            return {
+              url: config.baseURL + item.url,
+              name: item.name,
+              fileld: item.fileld,
+            };
+          });
+        } else {
+          obj[key] = [];
+        }
+      }
+    });
+    dataForm.value = obj;
+    // 提交日期如果没有值则赋值
+    if (!dataForm.value[649]) {
+      dataForm.value[649] = new Date(new Date().toLocaleDateString()).getTime();
+    }
+    // 最后修改日期赋值当前时间
+    dataForm.value[650] = new Date().getTime();
+    oldFormData.value = JSON.stringify(obj);
+    initOilTypeList();
+    DemoApi.getTiYouRenProject({
+      driverleader: dataForm.value[644],
+    }).then((res) => {
+      userProject.value = res.data.map((item) => {
+        return {
+          label: item.负责项目名,
+          value: item.负责项目名,
+          code: item.项目编号,
+        };
+      });
+    });
+    // 关闭加载中
+    toast.close();
+  });
+}
+
+const oilList = ref([
+  // 柴油 汽油
+  { label: '柴油', value: '柴油' },
+  { label: '汽油', value: '汽油' },
+]);
+
+const oilTypeList = ref([]);
+function initOilTypeList() {
+  let params = {
+    projectid: dataForm.value[651],
+    ypmc: dataForm.value[639],
+  };
+  DemoApi.getOilTypeList(params).then((res) => {
+    oilTypeList.value = res.data.map((item) => {
+      return {
+        label: item.油品型号,
+        value: item.油品型号,
+        md: item.合同定油品密度,
+      };
+    });
+  });
+}
+function oilTypeChange({ value }) {
+  dataForm.value[640] = value;
+  dataForm.value[549] = oilTypeList.value.find((item) => item.value === value).md;
+}
+function ypNameChange({ value }) {
+  dataForm.value[639] = value;
+}
+
+// 上传
+function handleChangeFile({ fileList }) {
+  // 如果不是数组
+  const arr = [];
+  if (!Array.isArray(fileList)) {
+    fileList = [];
+  }
+  for (let i = 0; i < fileList.length; i++) {
+    const val = fileList[i];
+    if (val.response) {
+      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);
+      }
+    } else {
+      const oldData = {
+        url: val.url,
+        name: val.name,
+        fileld: val.fileld,
+      };
+
+      arr.push(oldData);
+    }
+  }
+  dataForm.value[646] = arr;
+}
+
+const userList = ref([]);
+// 获取提油人
+function getUserList() {
+  DemoApi.getTiYouRen().then((res) => {
+    userList.value = res.data.map((item) => {
+      return {
+        label: item.队长名,
+        value: item.队长名,
+        phone: item.手机号码,
+      };
+    });
+  });
+}
+getUserList();
+const userProject = ref([]);
+// 获取全部项目
+function onUserChange({ value }) {
+  dataForm.value[644] = value;
+  dataForm.value[648] = userList.value.find((item) => item.value === value).phone;
+  // 获取全部项目
+  DemoApi.getTiYouRenProject({
+    driverleader: dataForm.value[644],
+  }).then((res) => {
+    userProject.value = res.data.map((item) => {
+      return {
+        label: item.负责项目名,
+        value: item.负责项目名,
+        code: item.项目编号,
+      };
+    });
+  });
+}
+// 负责的项目
+// 所有项目
+const allProject = ref([]);
+function getPriceList() {
+  DemoApi.getProjectInfo().then((res) => {
+    // 过滤所有
+    allProject.value = res.data.map((item) => {
+      return {
+        label: item.采购单名称 + ' ' + item.付款日期 + ' ' + item.采购单号,
+        value: item.采购单号,
+        // 付款单位名称: "内蒙古煜丰石油有限公司"
+        // 付款日期: "2024-03-12"
+        // 收款单位名称: "中海油销售湖北有限公司"
+        // 采购单价: "7550.0000"
+        // 采购单号: "CG2024000128"
+        // 采购单名称: "随信高速"
+        // 采购金额: "30200.0000"
+        // 项目名称: "随信高速"
+
+        采购单名称: item.采购单名称,
+        采购单价: item.采购单价,
+        采购金额: item.采购金额,
+        付款单位: item.付款单位名称,
+        收款单位: item.收款单位名称,
+      };
+    });
+  });
+}
+getPriceList();
+
+// 获取单价
+const priceList = ref([]);
+
+function projectNameChange({ value }) {
+  dataForm.value[638] = value;
+  dataForm.value[651] = userProject.value.find((item) => item.value === value).code;
+  initOilTypeList();
+}
+function getInvoiceCompanyLists({ value }) {
+  dataForm.value[641] = value;
+  // 采购单名称647 采购单价655 采购金额656 付款单位642 收款单位643
+  const find = allProject.value.find((item) => item.采购单号 === value);
+  dataForm.value[647] = find.采购单名称;
+  dataForm.value[655] = find.采购单价;
+  dataForm.value[656] = find.采购金额;
+  dataForm.value[642] = find.付款单位;
+  dataForm.value[643] = find.收款单位;
+}
+
+// 是否发票
+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[646] = dataForm.value[646].map((item) => {
+          return {
+            name: item.name,
+            fileld: item.fileld,
+            url: item.fileld,
+          };
+        });
+        let paramsData = {};
+        // 过滤所有空值 为空字符 或者 null 或者 空数组
+        Object.keys(dataForm.value).map((key) => {
+          if (
+            dataForm.value[key] !== '' &&
+            dataForm.value[key] !== null &&
+            dataForm.value[key]?.length !== 0
+          ) {
+            paramsData[key] = dataForm.value[key];
+          }
+        });
+        const params = {
+          id: id.value ? '/' + id.value : '',
+          formKey: formKey.value,
+          data: [
+            {
+              data: JSON.stringify(paramsData),
+              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[646] = dataForm.value[646].map((item) => {
+              return {
+                name: item.name,
+                fileld: item.fileld,
+                url: config.baseURL + item.fileld,
+              };
+            });
+
+            if (res.code === 200) {
+              toast.success('更新成功');
+              // 如果res.data是数组则提示新增成功
+              setTimeout(() => {
+                uni.redirectTo({
+                  url: '/pages/takeOil/list',
+                });
+              }, 3000);
+            } else {
+              toast.error('提交失败');
+            }
+          });
+        } else {
+          DemoApi.getAddData(params).then((res) => {
+            toast.close();
+            dataForm.value[646] = dataForm.value[646].map((item) => {
+              return {
+                name: item.name,
+                fileld: item.fileld,
+                url: config.baseURL + item.fileld,
+              };
+            });
+
+            if (res.code === 200) {
+              // 如果res.data是数组则提示新增成功
+              toast.success('新增成功');
+              // 返回上一页
+              // 三秒后返回上一页
+              setTimeout(() => {
+                uni.redirectTo({
+                  url: '/pages/takeOil/list',
+                });
+              }, 3000);
+            } else {
+              toast.error('提交失败');
+            }
+          });
+        }
+      }
+    })
+    .catch((error) => {
+      console.log(error, 'error');
+    });
+}
+</script>
+<style lang="scss" scoped>
+.footer {
+  padding-bottom: 20px;
+}
+</style>

+ 428 - 0
src/pages/takeOil/list.vue

@@ -0,0 +1,428 @@
+<template>
+  <view class="settlement-form">
+    <view class="search-view">
+      <wd-search
+        v-model="value"
+        cancel-txt="搜索"
+        @change="searchChange"
+        @cancel="cancelChange"
+        @focus="searchFocus"
+      >
+        <template #prefix>
+          <wd-popover v-model="show" mode="menu" :content="menu" @menuclick="changeSearchType">
+            <view class="search-type">
+              <text>{{ searchType }}</text>
+              <wd-icon custom-class="icon-arrow" name="fill-arrow-down" />
+            </view>
+          </wd-popover>
+        </template>
+      </wd-search>
+    </view>
+
+    <wd-action-sheet
+      v-model="showSheet"
+      :title="searchType"
+      :actions="actions"
+      @close="close"
+      @select="select"
+    />
+
+    <template v-for="(item, index) in settlementList" :key="index">
+      <wd-card :title="'项目编号:' + item[651].value">
+        <view class="project-body"  @click="goDetail(item)">
+          <view class="body-list" v-for="(field, i) in showListField" :key="i">
+            <view>{{ field.content }}: {{ item[field.field].value }}</view>
+          </view>
+        </view>
+        <template #footer>
+          <wd-button size="small" type="warning" @click="goDetail(item)">查看详情</wd-button>
+          <wd-button size="small" @click="goEdit(item)">编辑</wd-button>
+          <wd-button size="small" type="error" @click="deleteData(item)">删除</wd-button>
+        </template>
+      </wd-card>
+    </template>
+    <wd-loadmore custom-class="loadmore" :state="loadState" />
+  </view>
+  <!-- <view class="addbtn">
+    <wd-button block type="primary" @click="addData">新增</wd-button>
+  </view> -->
+  <wd-toast />
+  <wd-message-box />
+</template>
+<script setup lang="ts">
+import DemoApi from '@/api/DemoApi';
+import router from '@/router';
+import config from '@/http/config';
+import { ref } from 'vue';
+import { useToast, useMessage } from 'wot-design-uni';
+const message = useMessage();
+const show = ref<boolean>(false);
+const searchType = ref<string>('项目名称');
+const value = ref<string>('');
+const loadState = ref('loading');
+const menu = ref([
+  {
+    content: '项目名称',
+    filedName: 'projectName',
+  },
+]);
+const showListField = ref([
+
+  {
+    content: '项目名称',
+    field: 638,
+  },
+  {
+    content: '油品名称',
+    field:639,
+  }, // 油品型号
+  {
+    content: '油品型号',
+    field: 640,
+  }, // 合同定油品密度 6
+  {
+    content: '实际提油',
+    field: 654,
+  },
+]);
+const showSheet = ref<boolean>(false);
+function changeSearchType({ item, index }) {
+  searchType.value = item.content;
+  show.value = false;
+  showSheet.value = true;
+  if (index === 0) {
+    actions.value = projectList.value;
+  } else if (index === 1) {
+    actions.value = oilList.value;
+  } else if (index === 2) {
+    actions.value = userList.value;
+  }
+}
+function searchFocus() {
+  const keyStop = () => {
+    var interval = setInterval(function () {
+      uni.hideKeyboard(); //隐藏软键盘
+    }, 20);
+    setTimeout(() => {
+      clearInterval(interval);
+    }, 3000);
+  };
+  keyStop();
+  uni.hideKeyboard()
+  showSheet.value = true;
+}
+function searchChange(value) {
+  // 如果输入框为空则清空 searchForm
+  if (!value.value) {
+    searchForm.value = {
+      projectName: '',
+      oilName: '',
+      customerName: '',
+    };
+    getSettlementList('reset');
+  }
+}
+// cancelChange
+function cancelChange(value) {
+  getSettlementList('reset');
+}
+const actions = ref([]);
+// 油品名称
+const oilList = ref([{ name: '柴油' }, { name: '汽油' }]);
+// 客户名称
+const userList = ref([]);
+// 获取客户列表
+const getUserList = () => {
+  DemoApi.getCustomerList().then((res) => {
+    userList.value = res.data.map((item) => {
+      return { name: item.COL_ALIAS_1 };
+    });
+  });
+};
+getUserList();
+
+const projectList = ref([]);
+const getProjectList = () => {
+  // 获取项目列表
+  DemoApi.getProjectNameList().then((res) => {
+    projectList.value = res.data.map((item) => {
+      return { name: item.项目名称 };
+    });
+    actions.value = projectList.value;
+  });
+};
+getProjectList();
+onLoad(() => {
+  getSettlementList();
+});
+function close() {
+  showSheet.value = false;
+}
+const searchForm = ref({
+  projectName: '',
+  oilName: '',
+  customerName: '',
+});
+const toast = useToast();
+
+function select({ item, index }) {
+  showSheet.value = false;
+  if (searchType.value === '项目名称') {
+    searchForm.value.projectName = item.name;
+  } else if (searchType.value === '油品名称') {
+    searchForm.value.oilName = item.name;
+  } else if (searchType.value === '客户名称') {
+    searchForm.value.customerName = item.name;
+  }
+  value.value = item.name;
+}
+// 分页数据
+const pageQuery = ref({
+  current: 1,
+  size: 20,
+  descs: 536,
+  total: 0,
+});
+
+// 下拉刷新
+onPullDownRefresh(() => {
+  getSettlementList('reset');
+});
+// 上拉加载
+onReachBottom(() => {
+  console.log('上拉加载');
+  if (pageQuery.value.current * pageQuery.value.size < pageQuery.value.total) {
+    pageQuery.value.current++;
+    getSettlementList();
+  }
+});
+// 获取结算管理列表
+const formKey = ref<string>('63af99d0ee724d149a30b9a782397844');
+const idKeyData = ref<string>('');
+const settlementList = ref([]);
+const tableData = ref([]);
+const getSettlementList = (setparams) => {
+  // finished
+  loadState.value = 'loading';
+  if (setparams === 'reset') {
+    // 页码归于1
+    pageQuery.value.current = 1;
+  }
+  DemoApi.getConfig(formKey.value).then((res) => {
+    const { dbLinkId, idKey } = res.data;
+    idKeyData.value = idKey;
+    tableData.value = JSON.parse(res.data.tables || '[]');
+    // 匹配fieldName == menu name的值 并且再menu添加 fieldId
+    menu.value.map((item) => {
+      tableData.value.map((table) => {
+        if (table.fieldName === item.content) {
+          item.fieldId = table.fieldId;
+        }
+      });
+    });
+    const params = {
+      dbLinkId,
+      pageQuery: pageQuery.value,
+      paramList: [],
+    };
+    pageQuery.value.descs = JSON.parse(res.data.columnData || '{}')?.defaultSidx;
+    menu.value.map((item) => {
+      const obj = {
+        cubeColumnId: item.fieldId,
+        function: 'in',
+        values: [],
+      };
+      if (searchForm.value[item.filedName]) {
+        obj.values.push(searchForm.value[item.filedName]);
+      }
+      params.paramList.push(obj);
+    });
+
+    DemoApi.getFormDataList(params).then((resp) => {
+      const { columnDict, pageData } = resp.data;
+      pageQuery.value.total = pageData.total;
+      pageQuery.value.current = pageData.current;
+      pageQuery.value.size = pageData.size;
+      // columnDict 是 pageData.records 和 tableData 的映射关系
+      // columnDict的key是tableData的fieldId,value是pageData.records的 key
+      // pageData.records 是后台返回的数据
+      // tableData 是前台配置的表头
+      const idKey = columnDict[idKeyData.value];
+      const arr = [];
+      pageData.records.map((val) => {
+        const obj = {};
+        obj.id = val[idKey];
+        for (const key in columnDict) {
+          tableData.value.map((item) => {
+            if (item.fieldId == key) {
+              // obj[item.field] = val[columnDict[key]];
+              obj[item.fieldId] = {
+                value: val[columnDict[key]],
+                field: item.field,
+                fieldName: item.fieldName,
+                fieldId: item.fieldId,
+                pageDataRecordKey: columnDict[key],
+              };
+            }
+          });
+        }
+        arr.push(obj);
+      });
+      if (setparams === 'reset') {
+        settlementList.value = arr;
+      } else {
+        settlementList.value = settlementList.value.concat(arr);
+      }
+      loadState.value = 'finished';
+      // 关闭下拉刷新
+      uni.stopPullDownRefresh();
+      // 回到顶部
+    });
+  });
+};
+
+function goEdit(item) {
+  router.push({
+    path: 'pages/takeOil/form',
+    query: { filedsData: JSON.stringify(item || '[]'), formKey: formKey.value },
+  });
+}
+function addData() {
+  router.push({
+    path: 'pages/takeOil/form',
+    query: { filedsData: '[]', formKey: formKey.value },
+  });
+}
+// goDetail 去往详情页
+function goDetail(item) {
+  router.push({
+    path: 'pages/takeOil/detail',
+    query: { filedsData: JSON.stringify(item || '[]'), 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('reset');
+        },
+      });
+    });
+}
+</script>
+
+<style lang="scss" scoped>
+.search-type {
+  position: relative;
+  height: 30px;
+  line-height: 30px;
+  padding: 0 8px 0 16px;
+}
+.search-type::after {
+  position: absolute;
+  content: '';
+  width: 1px;
+  right: 0;
+  top: 5px;
+  bottom: 5px;
+  background: rgba(0, 0, 0, 0.25);
+}
+.search-type {
+  :deep(.icon-arrow) {
+    display: inline-block;
+    font-size: 20px;
+    vertical-align: middle;
+  }
+}
+// 固定底部
+.pagination {
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  z-index: 1;
+}
+.settlement-form {
+  padding-top: 130rpx;
+  min-height: calc(100vh - var(--window-top) - var(--window-bottom));
+  width: 100vw;
+  box-sizing: border-box;
+  background: #f1f1f1;
+  position: relative;
+}
+// 固定到顶部
+.search-view {
+  position: fixed;
+  top: 0;
+  left: 0;
+  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;
+  }
+}
+.addbtn {
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  padding: 20px;
+  box-sizing: border-box;
+}
+.project-body {
+  display: flex;
+  flex-direction: column;
+  .body-list {
+    .list-item {
+      display: flex;
+      justify-content: space-between;
+      .item-left {
+        width: 30%;
+      }
+      .item-right {
+        flex: 1;
+        text-align: right;
+      }
+    }
+  }
+}
+.settlement-form {
+  :deep .wd-button + .wd-button {
+    margin-left: 20rpx;
+  }
+}
+</style>