Procházet zdrojové kódy

普通报销H5表单页面支持

chenjun před 1 rokem
rodič
revize
c5dc5cf62f

+ 33 - 0
client_h5/src/pages/commonCost/index.scss

@@ -0,0 +1,33 @@
+.van-cell-group {
+  margin: 0px;
+}
+.van-overlay {
+  background: rgba(0,0,0,0.3);
+}
+.add_btn {
+  background-color: #1989fa;
+  padding: 5px 10px;
+  border: 0px;
+  outline: none;
+  font-size: 13px;
+  color: #fff;
+  border-radius: 2px;
+}
+.detail-popup {
+  >.title {
+    font-size: 15px;
+    padding-left: 10px;
+  }
+  >.fixed-btn {
+    padding: 15px;
+  }
+}
+  :deep(.van-swipe-cell__right) {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    >button {
+      height: 50%;
+    }
+  }

+ 264 - 0
client_h5/src/pages/commonCost/index.vue

@@ -0,0 +1,264 @@
+
+<template>
+  <flow-form :data="formData" @submit="submitNextActivity">
+    <card title="基础信息">
+      <van-form required="auto" ref="form" :readonly="formRead">
+        <van-cell-group inset>
+          <van-field
+            v-model="formData.userNickname"
+            name="报销人"
+            label="报销人"
+            placeholder="报销人"
+            readonly
+            :rules="[{ required: true, message: '未获取报销人' }]"
+          />
+          <van-field
+            v-model="formData.deptName"
+            name="所在部门"
+            label="所在部门"
+            placeholder="所在部门"
+            readonly
+            :rules="[{ required: true, message: '未获取所在部门' }]"
+          />
+          <van-field
+            v-model="formData.applyTime"
+            :formatter="formatDate"
+            name="申请时间"
+            label="申请时间"
+            placeholder="申请时间"
+            readonly
+            :rules="[{ required: true, message: '请填写申请时间' }]"
+          />
+          <van-field
+            v-model="formData.commonCostNo"
+            name="报销单号"
+            label="报销单号"
+            placeholder="报销单号"
+            readonly
+            :rules="[{ required: true, message: '未获取报销单号' }]"
+          />
+          <van-field
+            v-model="formData.paymentCompanyName"
+            name="付款单位"
+            label="付款单位"
+            placeholder="付款单位"
+            :rules="[{ required: true, message: '未获取付款单位' }]"
+          />
+          <van-field
+            v-model="formData.payment"
+            name="付款方式"
+            label="付款方式"
+            placeholder="付款方式"
+            :rules="[{ required: true, message: '未获取付款方式' }]"
+          />
+          <van-field
+            v-model="formData.totalAmount"
+            name="报销总金额"
+            label="报销总金额(元)"
+            placeholder="报销总金额"
+            :rules="[{ required: true, message: '未获取报销总金额' }]"
+          />
+          <van-field
+            v-model="formData.totalAmountCn"
+            name="大写单据总金额"
+            label="大写单据总金额"
+            placeholder="大写单据总金额"
+            :rules="[{ required: true, message: '未获取大写单据总金额' }]"
+          />
+          <van-field name="是否抵用借款" label="是否抵用借款">
+            <template #input>
+              <van-checkbox v-model="formData.dybyCheckBox" shape="square" />
+            </template>
+          </van-field>
+          <van-field
+            v-model="formData.bz1"
+            name="报销备注"
+            label="报销备注"
+            placeholder="报销备注"
+            type="textarea"
+            rows="3"
+            autosize
+            :rules="[{ required: true, message: '未获取报销备注' }]"
+          />
+        </van-cell-group>
+      </van-form>
+    </card>
+    <card title="单据详情">
+      <template #right>
+        <button class="add_btn" @click="popupShow = true" v-if="!formRead">
+          新增
+        </button>
+      </template>
+      <template #default>
+        <div v-for="(item, index) in formData.detailList" :key="index">
+          <van-swipe-cell :disabled="formRead">
+            <card-cell>
+              <van-cell
+                title="项目名称"
+                :value="item.projectName"
+              />
+              <van-cell title="项目部门" :value="item.projectDeptName" />
+              <van-cell
+                title="发生日期"
+                :value="formatDate(item.costDate, 'YYYY-MM-DD')"
+              />
+              <van-cell
+                title="费用实际所属类型"
+                :value="
+                  getDictLabel(
+                    DICT_TYPE.WF_COMMON_COST_TYPE,
+                    item.costType
+                  )
+                "
+              />
+              <van-cell title="发票内容" :value="item.costContent" />
+              <van-cell title="单据张数" :value="item.invoiceNums" />
+              <van-cell title="金额" :value="item.amount" />
+              <van-cell title="备注" :value="item.bz1" />
+            </card-cell>
+          </van-swipe-cell>
+        </div>
+      </template>
+    </card>
+  </flow-form>
+</template>
+
+<script setup lang="ts">
+import { useRoute } from "vue-router";
+import { FlowDTO, getNextActivity } from "@/service/flow";
+import reqest from "@/utils/request";
+import FlowForm from "@/components/flowForm.vue";
+import Card from "@/components/card.vue";
+import CardCell from "@/components/cardCell.vue";
+import { showSuccessToast, showFailToast } from "vant";
+import { formatDate } from "@/utils/formatTime";
+import { getDictOptions, getDictLabel, DICT_TYPE } from "@/utils/dict";
+
+const popupShow = ref<boolean>(false);
+const form = ref(null);
+const route = useRoute();
+interface FormDataType {
+  instanceId: string;
+  id: string;
+  userNickname: string;
+  deptName: string;
+  applyTime: any;
+  commonCostNo: string;
+  projectName: string;
+  paymentCompanyName: string;
+  paymentMethod: any;
+  payment: string;
+  dybx: any;
+  dybyCheckBox: boolean;
+  totalAmount: number | null;
+  totalAmountCn: string;
+  bz1: string;
+  detailList: {
+    commonCostId: string;
+    projectName: any;
+    projectDeptName: string;
+    costDate: any;
+    costType: string;
+    costContent: string;
+    invoiceNums: number;
+    amount: number;
+    bz1: string;
+  }[];
+}
+const formData = ref<FormDataType>({
+  instanceId: "",
+  id: "",
+  userNickname: "",
+  deptName: "",
+  applyTime: null,
+  commonCostNo: "",
+  projectName: "",
+  paymentCompanyName: "",
+  paymentMethod: null,
+  payment: "银行",
+  dybx: null,
+  dybyCheckBox: false,
+  totalAmount: null,
+  totalAmountCn: "",
+  boatCarAmout: "",
+  otherAmount: "",
+  carAmount: "",
+  bz1: "",
+  detailList: [],
+});
+
+const formRead = ref(false);
+const { activityInstanceId, participant, flowInstanceId, read, _o } =
+  route.query as {
+    activityInstanceId: string;
+    participant: string;
+    flowInstanceId: string;
+    read: string;
+    _o: string;
+  };
+const activityData: FlowDTO = {
+  activityInstanceId,
+  participantId: participant,
+  flowOpinion: "",
+};
+
+const submitNextActivity = async (activeOpinion: any) => {
+  form.value.validate().then(async () => {
+    //工作流转件
+    activityData.activityInstanceId = activityInstanceId;
+    activityData.participantId = participant;
+    activityData.flowOpinion = JSON.stringify(activeOpinion);
+    const result = await getNextActivity(jsonToFormData(activityData));
+    // getNextActivity(activityData).then(result => {
+    //   console.log(result)
+    // }).catch((err) => {
+    //   console.error(err)
+    // })
+  });
+};
+const jsonToFormData = (json: any): FormData | null => {
+  const keys: string[] = Object.keys(json);
+  if (keys.length > 0) {
+    const formData = new FormData();
+    keys.forEach((key) => {
+      formData.append(
+        key,
+        json[key] instanceof Object ? JSON.stringify(json[key]) : json[key]
+      );
+    });
+    return formData;
+  }
+  return null;
+};
+
+/** 初始化表单数据 */
+const initFormData = async () => {
+  const result = await reqest.get(
+    `/business/CommonCost/mobileAdd?flowInstanceId=${flowInstanceId}`
+  );
+  formData.value = result.data;
+  formData.value.applyTime = formatDate(formData.value.applyTime);
+  if (formData.value.dybx === 1) {
+    formData.value.dybyCheckBox = true;
+  } else {
+    formData.value.dybyCheckBox = false;
+  }
+  if (formData.value.paymentMethod === 1) {
+    formData.value.payment = '银行';
+  } else {
+    formData.value.payment = '现金';
+  }
+};
+
+/** 初始化 */
+onMounted(() => {
+  initFormData();
+  if (read === "1" || _o === "v") {
+    formRead.value = true;
+  }
+});
+</script>
+
+<style lang="scss" scoped>
+@import "./index.scss";
+</style>

+ 3 - 3
client_h5/src/pages/travelCost/index.vue

@@ -69,7 +69,7 @@
             :rules="[{ required: true, message: '未获取项目' }]"
           />
           <van-field
-            v-model="formData.travelPlace"
+            v-model="formData.paymentCompanyName"
             name="付款单位"
             label="付款单位"
             placeholder="付款单位"
@@ -232,7 +232,7 @@ interface FormDataType {
   endTime: any;
   travelPlace: string;
   projectName: string;
-  companyName: string;
+  paymentCompanyName: string;
   dybx: any;
   dybyCheckBox: boolean;
   totalAmount: number | null;
@@ -274,7 +274,7 @@ const formData = ref<FormDataType>({
   endTime: null,
   travelPlace: "",
   projectName: "",
-  companyName: "",
+  paymentCompanyName: "",
   dybx: null,
   dybyCheckBox: false,
   totalAmount: null,

+ 8 - 0
client_h5/src/router/routes.ts

@@ -69,6 +69,14 @@ const routes: RouteRecordRaw[] = [
         },
         component: () => import("@/pages/travelCost/index.vue"),
       },
+      {
+        path: "commonCost",
+        name: "CommonCost",
+        meta: {
+          title: "普通报销",
+        },
+        component: () => import("@/pages/commonCost/index.vue"),
+      },
       {
         path: "recruit",
         name: "Recruit",

+ 2 - 0
zjugis-business/src/main/java/com/zjugis/business/converter/commoncost/CommonCostConvert.java

@@ -25,6 +25,8 @@ public interface CommonCostConvert {
 
     CommonCostUpdateReqVO convert(CommonCostDO entity);
 
+    CommonCostRespVO convert01(CommonCostDO entity);
+
     List<CommonCostRespVO> convertList(List<CommonCostDO> list);
 
     PageResult<CommonCostRespVO> convertPage(PageResult<CommonCostDO> list);

+ 6 - 0
zjugis-business/src/main/java/com/zjugis/business/flow/commoncost/controller/CommonCostController.java

@@ -5,6 +5,7 @@ import com.zjugis.business.flow.commoncost.controller.vo.CommonCostPageReqVO;
 import com.zjugis.business.flow.commoncost.controller.vo.CommonCostRespVO;
 import com.zjugis.business.flow.commoncost.controller.vo.CommonCostUpdateReqVO;
 import com.zjugis.business.flow.commoncost.service.CommonCostService;
+import com.zjugis.business.flow.travelcost.controller.vo.TravelCostRespVO;
 import com.zjugis.business.flow.usemoney.controller.vo.UseMoneyOverviewVO;
 import com.zjugis.business.flow.usemoney.controller.vo.UseMoneyPageReqVO;
 import com.zjugis.framework.common.pojo.CommonResult;
@@ -55,6 +56,11 @@ public class CommonCostController extends BaseController {
         return resultPage(map);
     }
 
+    @GetMapping("/mobileAdd")
+    public CommonResult<CommonCostRespVO> mobileAdd(String activityTemplateId, String flowInstanceId, String userId) {
+        return CommonResult.success(commonCostService.flowAdd(flowInstanceId, userId));
+    }
+
     @PostMapping("/update")
     @Operation(summary = "更新普通报销流程")
     public String updateCommonCost(@Valid @RequestBody CommonCostUpdateReqVO updateReqVO) {

+ 8 - 0
zjugis-business/src/main/java/com/zjugis/business/flow/commoncost/controller/vo/CommonCostRespVO.java

@@ -5,6 +5,8 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
 
+import java.util.List;
+
 /**
  * @Author 陈俊
  * @Date 2024/1/4 14:05
@@ -27,4 +29,10 @@ public class CommonCostRespVO extends CommonCostBaseVO{
 
     @Schema(description = "状态")
     private String status;
+
+    @Schema(description = "普通报销明细")
+    private List<CommonCostDetailRespVO> detailList;
+
+    @Schema(description = "付款单位名称")
+    private String paymentCompanyName;
 }

+ 8 - 0
zjugis-business/src/main/java/com/zjugis/business/flow/commoncost/service/CommonCostService.java

@@ -101,4 +101,12 @@ public interface CommonCostService {
      * @return
      */
     List<CommonCostDO> getFinanceCostExcelList(FinanceCostRequest pageReqVO);
+
+    /**
+     * 流程数据添加
+     * @param flowInstanceId
+     * @param userId
+     * @return
+     */
+    CommonCostRespVO flowAdd(String flowInstanceId, String userId);
 }

+ 45 - 0
zjugis-business/src/main/java/com/zjugis/business/flow/commoncost/service/CommonCostServiceImpl.java

@@ -509,4 +509,49 @@ public class CommonCostServiceImpl implements CommonCostService {
     public List<CommonCostDO> getFinanceCostExcelList(FinanceCostRequest pageReqVO) {
         return commonCostDao.getFinanceCostExcelList(pageReqVO, commonService.getDeptCondition(pageReqVO.getDeptId()));
     }
+
+    @Override
+    public CommonCostRespVO flowAdd(String flowInstanceId, String userId) {
+        if (StringUtils.isNotBlank(SecurityFrameworkUtils.getLoginUserId())) {
+            userId = SecurityFrameworkUtils.getLoginUserId();
+        }
+        CommonResult<IFlowInstance> flowResult = workflowClient.flowInstance(flowInstanceId);
+        if (flowResult.isSuccess()) {
+            IFlowInstance flowInstance = flowResult.getData();
+            CommonCostDO entity = findByInstanceId(flowInstanceId);
+            if (Objects.isNull(entity)) {
+                entity = new CommonCostDO();
+                entity.setInstanceId(flowInstanceId);
+                entity.setUserId(userId);
+                entity.setCommonCostNo(flowInstance.getCode());
+                entity.setApplyTime(LocalDateTime.now());
+                entity.setCreateTime(LocalDateTime.now());
+                entity.setFlowStatus(FLOW_NOT_START);
+                entity.setPaymentCompanyId("4e99393c-c0ea-4146-a7fb-56fb8019c477");
+                entity.setPaymentMethod(1);
+                CommonResult<AdminUserRespDTO> result = adminUserApi.getUser(userId);
+                if (result.isSuccess()) {
+                    entity.setUserNickname(result.getData().getNickname());
+                    entity.setDeptId(result.getData().getDeptId());
+                    entity.setDeptName(result.getData().getDeptName());
+                }
+                commonCostDao.insert(entity);
+            }
+            CommonCostRespVO respVO = CommonCostConvert.INSTANCE.convert01(entity);
+            List<CommonCostDetailDO> detailList = commonCostDetailService.getListByCommonCostId(entity.getId());
+            List<CommonCostDetailRespVO> detailRespVOS = CommonCostDetailConvert.INSTANCE.convertList01(detailList);
+            detailRespVOS.forEach(x -> {
+                if (StringUtils.isNotBlank(x.getProjectId())) {
+                    Project project = projectService.selectById(x.getProjectId());
+                    x.setProjectName(project.getXmmc());
+                    x.setProjectDeptName(deptApi.getDept(project.getZrbmId()).getCheckedData().getName());
+                }
+            });
+            CommonResult<CompanyRespDTO> result = companyApi.getCompany(entity.getPaymentCompanyId());
+            respVO.setDetailList(detailRespVOS);
+            respVO.setPaymentCompanyName(result.getCheckedData().getName());
+            return respVO;
+        }
+        return null;
+    }
 }

+ 3 - 0
zjugis-business/src/main/java/com/zjugis/business/flow/travelcost/controller/vo/TravelCostRespVO.java

@@ -46,4 +46,7 @@ public class TravelCostRespVO extends TravelCostBaseVO{
 
     @Schema(description = "其他费用", requiredMode = Schema.RequiredMode.REQUIRED)
     private List<TravelCostOtherDO> otherList;
+
+    @Schema(description = "付款单位名称")
+    private String paymentCompanyName;
 }

+ 2 - 0
zjugis-business/src/main/java/com/zjugis/business/flow/travelcost/service/TravelCostServiceImpl.java

@@ -320,6 +320,8 @@ public class TravelCostServiceImpl implements TravelCostService {
             List<TravelCostBoatCarDO> boatCarList = travelCostBoatCarService.getListByTravelCostId(entity.getId());
             respVO.setOtherList(otherList);
             respVO.setBoatCarList(boatCarList);
+            CommonResult<CompanyRespDTO> result = companyApi.getCompany(entity.getPaymentCompanyId());
+            respVO.setPaymentCompanyName(result.getCheckedData().getName());
             return respVO;
         }
         return null;