瀏覽代碼

feat:开票流程

snow 2 年之前
父節點
當前提交
6847915cda
共有 22 個文件被更改,包括 475 次插入202 次删除
  1. 5 0
      src/api/InvoiceSales/invoiceApply/index.ts
  2. 1 0
      src/components/RemoteSelect/src/remote-select.tsx
  3. 54 38
      src/views/InvoiceSales/capitalClaim/components/basic-claim/related-order.vue
  4. 12 2
      src/views/InvoiceSales/capitalClaim/components/basic-claim/sales-modal.vue
  5. 1 1
      src/views/InvoiceSales/capitalPool/detail.vue
  6. 55 31
      src/views/InvoiceSales/invoiceApply/components/addEditForm.vue
  7. 19 11
      src/views/InvoiceSales/invoiceApply/components/approval-process/src/upload-invoice.vue
  8. 8 0
      src/views/InvoiceSales/invoiceApply/components/columns.tsx
  9. 4 6
      src/views/InvoiceSales/invoiceApply/components/edit-order.vue
  10. 4 44
      src/views/InvoiceSales/invoiceApply/components/invoice-detail/index.vue
  11. 18 31
      src/views/InvoiceSales/invoiceApply/components/order-dialog.vue
  12. 6 4
      src/views/InvoiceSales/invoiceApply/detail.vue
  13. 109 0
      src/views/InvoiceSales/returnTicket/components/create-refund/capital-modal.vue
  14. 113 0
      src/views/InvoiceSales/returnTicket/components/create-refund/index.vue
  15. 44 0
      src/views/InvoiceSales/returnTicket/config/configs.ts
  16. 2 2
      src/views/InvoiceSales/returnTicket/config/content.config.ts
  17. 9 5
      src/views/InvoiceSales/returnTicket/detail.vue
  18. 2 2
      src/views/InvoiceSales/returnTicket/index.vue
  19. 2 2
      src/views/InvoiceSales/sheetOrderPool/config/search.config.ts
  20. 1 19
      src/views/InvoiceSales/sheetOrderPool/index.vue
  21. 4 1
      src/views/interest/processPermission/components/process-list.vue
  22. 2 3
      src/views/interest/processPermission/index.vue

+ 5 - 0
src/api/InvoiceSales/invoiceApply/index.ts

@@ -33,3 +33,8 @@ export const httpOrderList = (data: object): ResponseType => {
 export const httpSetPost = (data: object): ResponseType => {
   return http.request("post", `${yewuApi}invsetpost`, { data });
 };
+
+//
+export const httpInvoiceList = (data: object): ResponseType => {
+  return http.request("post", `${yewuApi}invoicelist`, { data });
+};

+ 1 - 0
src/components/RemoteSelect/src/remote-select.tsx

@@ -20,6 +20,7 @@ const RemoteSelect = defineComponent({
     async function remoteMethod(val: string) {
       if (!val) return;
       const { responseLabelProp, responseValProp, requestProp, api } = props;
+      console.log(requestProp);
 
       loading.value = true;
       const { code, data, message } = await api({

+ 54 - 38
src/views/InvoiceSales/capitalClaim/components/basic-claim/related-order.vue

@@ -1,6 +1,6 @@
 <script setup lang="ts">
 import { ElMessage } from "element-plus";
-import { computed, ref } from "vue";
+import { computed, ref, unref } from "vue";
 import { order_columns, order_status } from "../../config/configs";
 import SalesModal from "./sales-modal.vue";
 
@@ -18,7 +18,6 @@ const saleModalRef = ref<InstanceType<typeof SalesModal>>(null);
 
 function addSaleOrder(sales) {
   saleOrderList.value = sales;
-
   //根据sequenceNo建立映射
   sales.forEach(
     // 默认值未付款金额
@@ -42,45 +41,62 @@ function handleCreate() {
 
   emit("create-btn-click", orderArr);
 }
+
+function handleDelete(sequenceNo: string) {
+  delete mapSequenceNoToWapyfee.value[sequenceNo];
+  saleOrderList.value = saleOrderList.value.filter(
+    row => row.sequenceNo !== sequenceNo
+  );
+}
 </script>
 
 <template>
-  <div flex justify-between items-center>
-    <h1 my-4>关联订单:</h1>
-    <el-button
-      v-if="disabled"
-      type="primary"
-      @click="() => saleModalRef.onDisplay()"
-      >添加</el-button
-    >
-  </div>
+  <div>
+    <div flex justify-between items-center>
+      <h1 my-4>关联订单:</h1>
+      <el-button
+        v-if="disabled"
+        type="primary"
+        @click="() => saleModalRef.onDisplay(unref(saleOrderList))"
+        >添加</el-button
+      >
+    </div>
 
-  <el-table :data="saleOrderList" size="small">
-    <el-table-column
-      v-for="(col, index) in order_columns"
-      :key="index"
-      :label="col.label"
-      :prop="col.prop"
-      show-overflow-tooltip
-    >
-      <template #default="{ row }">
-        <el-input
-          size="small"
-          placeholder="此次认领金额"
-          v-if="col.label === '此次认领'"
-          v-model="mapSequenceNoToWapyfee[row.sequenceNo]"
-        />
-
-        <el-tag v-else-if="col.prop === 'status'">
-          {{ order_status.find(p => row.status === p.value)?.label }}
-        </el-tag>
-      </template>
-    </el-table-column>
-  </el-table>
-
-  <div flex justify-end mt-3 v-if="disabled">
-    <el-button type="primary" @click="handleCreate">保存</el-button>
-  </div>
+    <el-table :data="saleOrderList" size="small">
+      <el-table-column
+        v-for="(col, index) in order_columns"
+        :key="index"
+        :label="col.label"
+        :prop="col.prop"
+        show-overflow-tooltip
+      >
+        <template #default="{ row }">
+          <el-input
+            size="small"
+            placeholder="此次认领金额"
+            v-if="col.label === '此次认领'"
+            v-model="mapSequenceNoToWapyfee[row.sequenceNo]"
+          />
+
+          <el-tag v-else-if="col.prop === 'status'">
+            {{ order_status.find(p => row.status === p.value)?.label }}
+          </el-tag>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="操作">
+        <template #="{ row }">
+          <el-button type="danger" link @click="handleDelete(row.sequenceNo)"
+            >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
 
-  <SalesModal ref="saleModalRef" @save-click-button="addSaleOrder" />
+    <div flex justify-end mt-3 v-if="disabled">
+      <el-button type="primary" @click="handleCreate">保存</el-button>
+    </div>
+
+    <SalesModal ref="saleModalRef" @save-click-button="addSaleOrder" />
+  </div>
 </template>

+ 12 - 2
src/views/InvoiceSales/capitalClaim/components/basic-claim/sales-modal.vue

@@ -1,5 +1,5 @@
 <script setup lang="ts">
-import { onMounted, reactive, ref, unref } from "vue";
+import { nextTick, onMounted, reactive, ref, unref } from "vue";
 import { httpSaleList } from "/@/api/InvoiceSales/capitalClaim";
 import { useResponseHandle } from "/@/hooks";
 
@@ -9,6 +9,7 @@ import {
   sale_columns,
   sale_order_status
 } from "../../config/configs";
+import { ElTable } from "element-plus";
 
 const emit = defineEmits(["save-click-button"]);
 
@@ -16,6 +17,7 @@ const visible = ref(false);
 const loading = ref(false);
 const saleOrderList = ref<Array<Record<string, string>>>([]);
 const selectSaleOrder = ref<Array<Record<string, string>>>([]);
+const tableRef = ref<InstanceType<typeof ElTable>>(null);
 const responseHandle = useResponseHandle();
 
 const pagination = reactive({
@@ -54,7 +56,14 @@ function handleSave() {
 }
 
 defineExpose({
-  onDisplay: () => (visible.value = true)
+  onDisplay: (_list: Array<Record<string, string>>) => {
+    visible.value = true;
+
+    nextTick(() => {
+      tableRef.value.clearSelection();
+      _list.forEach(item => tableRef.value.toggleRowSelection(item, true));
+    });
+  }
 });
 
 //初始化订单列表
@@ -67,6 +76,7 @@ onMounted(() => requesetTradeOrderList());
       v-loading="loading"
       :data="saleOrderList"
       @selection-change="handleSelection"
+      ref="tableRef"
       size="small"
       row-key="sequenceNo"
     >

+ 1 - 1
src/views/InvoiceSales/capitalPool/detail.vue

@@ -64,7 +64,7 @@ onMounted(() => initalData());
       <ElTabPane label="详情">
         <ElCollapse v-model="collapses">
           <!-- 详情 -->
-          <ElCollapseItem title="订单对账详情" name="1">
+          <ElCollapseItem title="资金详情" name="1">
             <BasicDescriptions
               :columns="capital_detail_columns"
               :data="capitalDetail"

+ 55 - 31
src/views/InvoiceSales/invoiceApply/components/addEditForm.vue

@@ -2,14 +2,15 @@
 import { FormRules, ElForm } from "element-plus";
 import { reactive, ref } from "vue";
 import { httpAdd } from "/@/api/InvoiceSales/invoiceApply";
-import { inv_type_list } from "/@/utils/status";
 import RemoteSelect from "/@/components/RemoteSelect";
-import { httpList as httpBuyList } from "/@/api/parameter/invoiceheader";
+import { httpInvoiceList } from "/@/api/InvoiceSales/invoiceApply";
 import { httpList as httpCompanylist } from "/@/api/parameter/finance";
 import OrderDialog from "./order-dialog.vue";
 import EditOrder from "./edit-order.vue";
 import { useResponseHandle } from "/@/hooks";
 import { useRouter } from "vue-router";
+import { isChinese, isIDentityCard, isEmoticon } from "/@/utils/validate";
+import { inv_type_list } from "./../status";
 
 enum FROM_TYPE {
   order = "order",
@@ -33,8 +34,10 @@ const initform = {
   invtype: "", //开票类型
   email: "", //邮箱
   remark: "", //备注
-  orderArr: [], //开票销售单明细 obj:sequenceNo//销售单编号 inv_fee//销售单开票金额
-  companyType: ""
+  orderArr: [], //开票销售单明细 obj:sequenceNo//销售单编号 inv_fee//销售单开票金额,
+  companyType: "01"
+  // id_number: "",
+  // real_name: "",
 };
 
 const ruleForm = ref({ ...initform });
@@ -75,6 +78,24 @@ const rules = reactive<FormRules>({
       message: "请输入申请备注",
       trigger: "blur"
     }
+  ],
+  id_number: [
+    {
+      validator(_, value) {
+        return !value || isIDentityCard(value);
+      },
+      trigger: "blur",
+      message: "身份证号格式不正确"
+    }
+  ],
+  real_name: [
+    {
+      validator(_, value) {
+        return !value || (isChinese(value) && !isEmoticon(value));
+      },
+      trigger: "blur",
+      message: "真实姓名格式不正确"
+    }
   ]
 });
 
@@ -95,14 +116,15 @@ const handleDelete = (index: number) => {
 };
 
 function handleSave() {
-  formRef.value.validate(async vaild => {
-    if (!vaild) return;
+  formRef.value.validate(async isValid => {
+    if (!isValid) return;
 
-    const { code, message } = httpAdd({
+    const { code, message } = await httpAdd({
       ...ruleForm.value,
       orderArr: Object.keys(mapSequenceNoToInvfee.value).map(sequenceNo => ({
         sequenceNo,
-        inv_fee: mapSequenceNoToInvfee.value[sequenceNo]
+        inv_fee: mapSequenceNoToInvfee.value[sequenceNo],
+        num: "2"
       }))
     });
 
@@ -169,17 +191,19 @@ function handleAddOrder(list) {
             label-width="135px"
           >
             <RemoteSelect
+              is-root
               v-model:value="ruleForm.buy_id"
-              :api="httpBuyList"
+              :api="httpInvoiceList"
               style="width: 100%"
               placeholder="购买方公司抬头"
+              request-prop="name"
               response-label-prop="invoice_title"
-              response-val-prop="checkNo"
+              response-val-prop="id"
               @itemChange="companyNo_change()"
             /> </el-form-item
         ></el-col>
-        <el-col :span="8">
-          <el-form-item label-width="120px" label="发票类型" prop="invtype">
+        <el-col :span="6">
+          <el-form-item label-width="100px" label="发票类型" prop="invtype">
             <el-select
               v-model="ruleForm.invtype"
               style="width: 100%"
@@ -194,28 +218,27 @@ function handleAddOrder(list) {
               />
             </el-select>
           </el-form-item>
-          <el-form-item label-width="120px" label="电子邮箱" prop="email">
+          <el-form-item label-width="100px" label="电子邮箱" prop="email">
             <el-input v-model="ruleForm.email" placeholder="电子邮箱"
           /></el-form-item>
-          <!-- <el-form-item
-            label-width="120px"
-            label="业务公司类型"
-            prop="companyType"
-          >
-            <el-select w-full v-model="ruleForm.companyType">
-              <el-option value="01" label="企业" />
-              <el-option value="02" label="机关事业单位" />
-              <el-option value="03" label="个人" />
-              <el-option value="04" label="其他" />
-            </el-select>
-          </el-form-item> -->
         </el-col>
 
-        <el-col :span="9">
-          <el-form-item label="申请备注" prop="remark">
+        <el-col :span="6">
+          <el-form-item label-width="120px" label="真实姓名" prop="real_name">
+            <el-input v-model="ruleForm.real_name" placeholder="真实姓名" />
+          </el-form-item>
+
+          <el-form-item label-width="120px" label="身份证号" prop="id_number">
+            <el-input v-model="ruleForm.id_number" placeholder="身份证号"
+          /></el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="申请备注" prop="remark" label-width="135px">
             <el-input
+              w-full
               v-model="ruleForm.remark"
-              :rows="4"
+              :rows="3"
               type="textarea"
               maxlength="2000"
               placeholder="申请备注"
@@ -239,9 +262,10 @@ function handleAddOrder(list) {
               show-overflow-tooltip
               width="200"
             />
-            <el-table-column prop="ainv_fee" label="已开票" width="160" />
-            <el-table-column prop="inv_fee" label="开票中" width="160" />
-            <el-table-column prop="winv_fee" label="未开票" width="160" />
+
+            <el-table-column prop="ainv_fee" label="已开票" width="120" />
+            <el-table-column prop="inv_fee" label="开票中" width="120" />
+            <el-table-column prop="winv_fee" label="未开票" width="120" />
 
             <el-table-column label="开票金额" width="110">
               <template #="{ row }">{{

+ 19 - 11
src/views/InvoiceSales/invoiceApply/components/approval-process/src/upload-invoice.vue

@@ -12,21 +12,21 @@ const disabled = computed(() => formData.input_type === "1");
 const barCodeInput = ref("");
 
 const formData = reactive({
-  invNo: "",
   status: "",
   open_type: "",
   remark: "",
   invCode: "",
   invNum: "",
   open_date: null,
-  total_fee: "",
-  input_type: "1",
-  subtotal_fee: 1,
+  total_fee: 0,
+  input_type: "",
+  subtotal_fee: 0,
   inv_type: ""
 });
 
 function handleSaveStatus() {
-  emit("changeStatus", formData);
+  const { subtotal_fee } = formData;
+  emit("changeStatus", { ...formData, subtotal_fee: String(subtotal_fee) });
 }
 </script>
 
@@ -138,12 +138,9 @@ function handleSaveStatus() {
       ></el-col>
       <el-col :span="8">
         <el-form-item label="开票日期" prop="open_date">
-          <el-input-number
+          <el-date-picker
+            value-format="YYYY-MM-DD HH:mm:ss"
             v-model="formData.open_date"
-            :precision="0"
-            style="width: 100%"
-            :min="1"
-            :max="999"
             :disabled="disabled"
           /> </el-form-item
       ></el-col>
@@ -159,13 +156,24 @@ function handleSaveStatus() {
           /> </el-form-item
       ></el-col>
       <el-col :span="8">
+        <el-form-item label="税后金额" prop="total_fee">
+          <el-input-number
+            v-model="formData.total_fee"
+            :precision="2"
+            style="width: 100%"
+            :min="0"
+            :max="999999"
+            :disabled="disabled"
+          /> </el-form-item
+      ></el-col>
+      <!-- <el-col :span="8">
         <el-form-item label="校验码" prop="total_fee">
           <el-input
             v-model="formData.total_fee"
             :disabled="disabled"
             placeholder="校验码"
           /> </el-form-item
-      ></el-col>
+      ></el-col> -->
     </el-row>
     <div class="flex justify-end">
       <el-button type="primary" @click="handleSaveStatus">保存</el-button>

+ 8 - 0
src/views/InvoiceSales/invoiceApply/components/columns.tsx

@@ -172,6 +172,14 @@ export const order_detail_columns = [
     field: "customerName",
     label: "客户名称"
   },
+  {
+    field: "goodNum",
+    label: "商品数量"
+  },
+  {
+    field: "goodPrice",
+    label: "商品单价"
+  },
   {
     field: "goodName",
     label: "商品名称"

+ 4 - 6
src/views/InvoiceSales/invoiceApply/components/edit-order.vue

@@ -34,12 +34,10 @@ defineExpose({
       :columns="order_detail_columns"
     >
       <template #custom>
-        <el-descriptions-item label="开票金额">
-          <el-input
-            size="small"
-            v-model="inv_fee"
-            placeholder="请输入开票金额"
-          />
+        <el-descriptions-item label="开票金额" />
+
+        <el-descriptions-item label="数量">
+          <el-input-number />
         </el-descriptions-item>
       </template>
     </BasicDescriptions>

+ 4 - 44
src/views/InvoiceSales/invoiceApply/components/invoice-detail/index.vue

@@ -2,55 +2,15 @@
 import { inv_open_columns } from "/@/utils/details/inv-open";
 import BasicDescriptions from "/@/components/BasicDescriptions";
 
-const mock_data = {
-  id: 6,
-  invNo: "INV2207271542474795",
-  inv_value: "650.00",
-  inv_out: "GS2203161855277894",
-  inv_in: "KH2206091605154719",
-  apply_id: 44,
-  apply_name: "吴广广",
-  inv_type: 1,
-  open_type: 2,
-  is_ticket: 0,
-  exam_remark: "yeye",
-  remark: "1212",
-  email: "",
-  winv_fee: "650.00",
-  ainv_fee: "0.00",
-  post_fee: "26.00",
-  post_code: "SF12321321312312",
-  post_company: "顺丰快递",
-  status: 6,
-  is_del: 0,
-  addtime: "2022-07-27 15:42:47",
-  updatetime: "2022-07-27 16:47:31",
-  buyer_title: "泰康人寿保险有限责任公司大连分公司",
-  buyer_code: "91210200736420120U",
-  buyer_addr: "辽宁省大连市中山区五五路4A号上方港景A座32层",
-  buyer_mobile: "0411-82800287",
-  buyer_bank: "中国建设银行大连人民路支行",
-  buyer_bankNo: "21201500250053000712",
-  seller_title: "北京万宇恒通国际科贸有限公司",
-  seller_code: "91110113MA004JNJ28",
-  seller_addr: "北京市顺义区信中街12号院8号楼-1至4层101内三层309室",
-  seller_mobile: "010-69464815",
-  seller_bank: "中国农业银行股份有限公司北京空港支行",
-  seller_bankNo: "11120901040013561",
-  voider: " ",
-  payee: " ",
-  drawer: " ",
-  reviewer: " ",
-  ownerPlace: " ",
-  companyName: "北京万宇恒通国际科贸有限公司",
-  customerName: "泰康小卖部视频号直播间客户"
-};
+defineProps<{
+  detail: Record<string, string>;
+}>();
 </script>
 
 <template>
   <BasicDescriptions
     ref="defaultRef"
-    :data="mock_data"
+    :data="detail"
     :columns="inv_open_columns"
     :col-number="3"
   />

+ 18 - 31
src/views/InvoiceSales/invoiceApply/components/order-dialog.vue

@@ -122,7 +122,6 @@ defineExpose({
       top="5vh"
       title="添加销售订单"
       :width="'1040px'"
-      v-loading="loading"
     >
       <el-row :gutter="10" mb-2>
         <el-col :span="12">
@@ -201,36 +200,24 @@ defineExpose({
         /></el-col>
       </el-row>
 
-      <PureTable
-        ref="tableRef"
-        border
-        align="left"
-        row-key="id"
-        table-layout="auto"
-        :size="'small'"
-        :data="dataList"
-        :columns="columns"
-        :pagination="pagination"
-        :paginationSmall="true"
-        :header-cell-style="{ background: '#fafafa', color: '#606266' }"
-        @selection-change="handleSelectionChange"
-        @size-change="handleSizeChange"
-        @current-change="handleCurrentChange"
-      />
-      <!-- <TableProBar
-        style="margin-top: -10px"
-        title="销售订单列表"
-        :loading="loading"
-        :dataList="dataList"
-        @refresh="onSearch"
-      >
-        <template #buttons>
-          <el-button type="primary" @click="handleSave()"> 保存 </el-button>
-        </template>
-        <template v-slot="{ size }">
-       
-        </template>
-      </TableProBar> -->
+      <div v-loading="loading">
+        <PureTable
+          ref="tableRef"
+          border
+          align="left"
+          row-key="id"
+          table-layout="auto"
+          :size="'small'"
+          :data="dataList"
+          :columns="columns"
+          :pagination="pagination"
+          :paginationSmall="true"
+          :header-cell-style="{ background: '#fafafa', color: '#606266' }"
+          @selection-change="handleSelectionChange"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+        />
+      </div>
 
       <el-button type="primary" @click="handleConfirm">保存</el-button>
     </el-dialog>

+ 6 - 4
src/views/InvoiceSales/invoiceApply/detail.vue

@@ -29,7 +29,8 @@ const id = computed(() => query.id);
 const isCreate = computed(() => !id.value);
 
 const currentProcess = computed(() => {
-  return approvalProcess["0"];
+  const { status } = invDetail.value;
+  return approvalProcess[status] || {};
 });
 
 async function handleChangeStatus({ status, ...otherParmas }) {
@@ -39,6 +40,7 @@ async function handleChangeStatus({ status, ...otherParmas }) {
   if (!status) {
     response = await httpSetPost({ invNo, ...otherParmas });
   } else {
+    console.log(invNo, otherParmas);
     response = await httpStatus({ invNo, status, ...otherParmas });
   }
 
@@ -47,12 +49,12 @@ async function handleChangeStatus({ status, ...otherParmas }) {
   responseHandle({
     code,
     message,
-    handler: () => console.log(111)
+    handler: () => push("/InvoiceSales/invoiceApply")
   });
 }
 
 async function requesetInvDetail() {
-  const { code, message, data } = httpDetail({
+  const { code, message, data } = await httpDetail({
     invNo: id.value
   });
 
@@ -75,7 +77,7 @@ onMounted(() => !isCreate.value && requesetInvDetail());
       <el-tab-pane label="业务详情" name="1">
         <el-collapse v-model="collapseItem">
           <el-collapse-item title="发票申请详情" name="2">
-            <InvoiceDetail />
+            <InvoiceDetail :detail="invDetail" />
           </el-collapse-item>
           <el-collapse-item :title="currentProcess.title" name="3">
             <component

+ 109 - 0
src/views/InvoiceSales/returnTicket/components/create-refund/capital-modal.vue

@@ -0,0 +1,109 @@
+<script setup lang="ts">
+import { onMounted, reactive, ref, unref } from "vue";
+import { ElTable } from "element-plus";
+import { useResponseHandle } from "/@/hooks";
+import { httpList } from "/@/api/InvoiceSales/invoiceApply";
+import { inv_columns } from "./../../config/configs";
+const paymentList = ref<Array<Record<string, string>>>([]);
+const selectOrder = ref<Array<Record<string, string>>>([]);
+const visible = ref(false);
+
+const emit = defineEmits(["on-add-order"]);
+const loading = ref(false);
+const tableRef = ref<InstanceType<typeof ElTable>>(null);
+const responseHandle = useResponseHandle();
+
+const pagination = reactive({
+  pageSize: 10,
+  currentPage: 1,
+  total: 0
+});
+
+async function requestPaymentList() {
+  const { pageSize: size, currentPage: page } = pagination;
+  loading.value = true;
+  const { code, message, data } = await httpList({
+    status: "3",
+    size,
+    page
+  });
+
+  responseHandle({
+    code,
+    message,
+    handler: () => {
+      console.log(data.count);
+      pagination.total = data.count;
+      paymentList.value = data.list;
+    }
+  });
+
+  loading.value = false;
+}
+
+function handleConfirm() {
+  visible.value = false;
+  emit("on-add-order", unref(selectOrder.value[0]));
+}
+
+function handleSelectionChange(values) {
+  if (values.length > 1) {
+    const value = values.pop();
+    tableRef.value.clearSelection();
+    tableRef.value.toggleRowSelection(value, true);
+    selectOrder.value = [value];
+  } else {
+    selectOrder.value = [values[0]];
+  }
+}
+
+defineExpose({
+  onDisplay: () => (visible.value = true)
+});
+
+onMounted(() => requestPaymentList());
+</script>
+
+<template>
+  <el-dialog v-model="visible" title="发票列表" center>
+    <el-table
+      v-loading="loading"
+      border
+      ref="tableRef"
+      :data="paymentList"
+      size="small"
+      row-key="id"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" />
+      <el-table-column
+        v-for="(col, index) in inv_columns"
+        :key="index"
+        v-bind="col"
+        show-overflow-tooltip
+      />
+    </el-table>
+
+    <el-pagination
+      v-model:current-page="pagination.currentPage"
+      v-model:page-size="pagination.pageSize"
+      :total="pagination.total"
+      @current-change="requestPaymentList"
+    />
+
+    <div w-full flex justify-end mt-2>
+      <el-button type="primary" size="small" @click="handleConfirm"
+        >确定</el-button
+      >
+      <el-button size="small" @click="() => (visible = false)">取消</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<style lang="scss" scoped>
+:deep(.el-table__header) {
+  .el-checkbox {
+    display: none;
+  }
+}
+</style>

+ 113 - 0
src/views/InvoiceSales/returnTicket/components/create-refund/index.vue

@@ -0,0 +1,113 @@
+<script setup lang="ts">
+import { reactive, ref } from "vue";
+import CapitalModal from "./capital-modal.vue";
+import BasicDescriptions from "/@/components/BasicDescriptions";
+import { httpAdd } from "/@/api/InvoiceSales/returnTicket";
+import { httpDetail } from "/@/api/InvoiceSales/invoiceApply";
+import { useResponseHandle } from "/@/hooks";
+import { ElForm } from "element-plus";
+import { useRouter } from "vue-router";
+import { inv_open_columns } from "/@/utils/details/inv-open";
+
+const capitalModalRef = ref<InstanceType<typeof CapitalModal>>(null);
+const capitalDetail = ref<Record<string, string | null>>(null);
+const formRef = ref<InstanceType<typeof ElForm>>(null);
+const responseHandle = useResponseHandle();
+const { push } = useRouter();
+const loading = ref(false);
+
+const formData = reactive({
+  invNo: "",
+  return_reason: "",
+  remark: ""
+});
+
+const rules = {
+  invNo: [{ required: true, trigger: "change", message: "请选择一张发票" }],
+  return_reason: [
+    { required: true, trigger: "change", message: "请输入退货原因" }
+  ],
+  remark: [{ required: true, trigger: "change", message: "请输入备注" }]
+};
+
+async function requesetCapitalDetail(invNo) {
+  loading.value = true;
+
+  const { code, message, data } = await httpDetail({
+    invNo
+  });
+
+  responseHandle({
+    code,
+    message,
+    handler: function () {
+      capitalDetail.value = data;
+      formData.invNo = data.invNo;
+      formRef.value.validateField("logNo");
+    }
+  });
+  loading.value = false;
+}
+
+function handleCreate() {
+  formRef.value.validate(async isVaild => {
+    if (!isVaild) return;
+
+    const { code, message } = await httpAdd(formData);
+
+    responseHandle({
+      code,
+      message,
+      handler: () => push("/InvoiceSales/refund")
+    });
+  });
+}
+</script>
+<template>
+  <h1 text-xl font-bold mb-2>创建退票申请</h1>
+
+  <el-form
+    :rules="rules"
+    :model="formData"
+    ref="formRef"
+    size="small"
+    label-width="100px"
+  >
+    <el-form-item label="发票" prop="invNo">
+      <div flex justify-end w-full mb-2>
+        <el-button
+          size="small"
+          type="primary"
+          @click="() => capitalModalRef.onDisplay()"
+          >选择</el-button
+        >
+      </div>
+
+      <BasicDescriptions
+        w-full
+        v-loading="loading"
+        v-if="capitalDetail"
+        :data="capitalDetail"
+        :col-number="2"
+        :columns="inv_open_columns"
+      />
+    </el-form-item>
+
+    <el-form-item label="退款原因" prop="return_reason" w-480px>
+      <el-input v-model="formData.return_reason" placeholder="请输入退款原因" />
+    </el-form-item>
+
+    <el-form-item label="备注" prop="remark" w-480px>
+      <el-input v-model="formData.remark" placeholder="请输入备注" />
+    </el-form-item>
+
+    <div flex w-full justify-end>
+      <el-button type="primary" @click="handleCreate">保存</el-button>
+    </div>
+  </el-form>
+
+  <CapitalModal
+    ref="capitalModalRef"
+    @on-add-order="({ invNo }) => requesetCapitalDetail(invNo)"
+  />
+</template>

+ 44 - 0
src/views/InvoiceSales/returnTicket/config/configs.ts

@@ -0,0 +1,44 @@
+export const inv_columns = [
+  {
+    label: "发票申请编号",
+    prop: "invNo",
+    width: 140
+  },
+
+  {
+    label: "企业客户编码",
+    prop: "inv_in",
+    width: 140
+  },
+  {
+    label: "企业客户名称",
+    prop: "username",
+    width: 140
+  },
+
+  {
+    label: "发票额度",
+    prop: "inv_value",
+    width: 110
+  },
+  {
+    label: "业务公司编码",
+    prop: "inv_out",
+    width: 160
+  },
+  {
+    label: "业务公司名称",
+    prop: "email",
+    width: 140
+  },
+  {
+    label: "申请人",
+    prop: "apply_name",
+    width: 80
+  },
+  {
+    label: "创建时间",
+    width: 145,
+    prop: "createTime"
+  }
+];

+ 2 - 2
src/views/InvoiceSales/returnTicket/config/content.config.ts

@@ -45,7 +45,7 @@ const columns = [
     formatter: ({ addtime }) => dayjs(addtime).format("YYYY-MM-DD HH:mm:ss")
   },
   {
-    label: "资金状态",
+    label: "状态",
     prop: "status",
     cellRenderer: ({ row }) => {
       return h(ElTag, null, {
@@ -102,7 +102,7 @@ const contentConfig: ContentConfig = {
       return_reason: "开多票",
       return_type: 1,
       remark: "退票",
-      status: 2,
+      status: "2",
       red_inv: "hc1213213321",
       apply_id: 44,
       apply_name: "吴广广",

+ 9 - 5
src/views/InvoiceSales/returnTicket/detail.vue

@@ -5,6 +5,7 @@ import RefundDetail from "./components/refund-detail/index.vue";
 import { approval_process } from "./components/approval-process";
 import { useResponseHandle } from "/@/hooks";
 import { httpStatus, httpDetail } from "/@/api/InvoiceSales/returnTicket";
+import CreateRefund from "./components/create-refund/index.vue";
 
 const { query } = useRoute();
 const { push } = useRouter();
@@ -16,7 +17,7 @@ const isCreate = computed(() => !returnCode.value);
 
 //TODO:delete
 const refundDetail = ref<Record<string, string>>({
-  id: 1,
+  id: "1",
   returnCode: "RIN2207271638256857",
   invNo: "INV2207271542474795",
   return_reason: "开多票",
@@ -24,13 +25,13 @@ const refundDetail = ref<Record<string, string>>({
   remark: "退票",
   status: "0",
   red_inv: "hc1213213321",
-  apply_id: 44,
+  apply_id: "44",
   apply_name: "吴广广",
   addtime: "2022-07-27 16:38:25",
   updatetime: "2022-07-27 16:47:31",
   inv_out: "GS2203161855277894",
   inv_value: "650.00",
-  inv_apply_id: 44,
+  inv_apply_id: "44",
   inv_apply_name: "吴广广",
   inv_type: "1",
   open_type: "2",
@@ -89,14 +90,17 @@ async function requesetRetrunTicketStatus(otherParmas) {
 
 function initalData() {
   if (isCreate.value) return;
-  // requesetRefundDetail();
+  requesetRefundDetail();
 }
 
 onMounted(() => initalData());
 </script>
 <template>
   <div class="refund__content" bg-white>
-    <ElTabs>
+    <div v-if="isCreate">
+      <CreateRefund />
+    </div>
+    <ElTabs v-else>
       <ElTabPane label="详情">
         <!-- 详情 -->
         <ElCollapse v-model="collapses">

+ 2 - 2
src/views/InvoiceSales/returnTicket/index.vue

@@ -17,7 +17,7 @@ defineOptions({
 const { push } = useRouter();
 const { pageContentRef, handleResetClick, handleSearchClick } = usePageSearch();
 
-const { pageModalRef, handleCreateData, handleConfrim } = usePageModal({
+const { pageModalRef, handleConfrim } = usePageModal({
   pageContentRef
 });
 
@@ -50,7 +50,7 @@ onMounted(
           ref="pageContentRef"
           :content-config="contentConfig"
           @preview-btn-click="({ returnCode }) => toDetail(returnCode)"
-          @create-btn-click="handleCreateData"
+          @create-btn-click="() => push('/InvoiceSales/returnTicketDetail')"
         />
       </div>
 

+ 2 - 2
src/views/InvoiceSales/sheetOrderPool/config/search.config.ts

@@ -21,8 +21,8 @@ const searchFormConfig: FormConfig = {
       type: "range",
       placeholder: "未核销范围",
       otherOptions: {
-        startPlaceholder: "未核销开始范围",
-        endPlaceholder: "未核销结束范围"
+        startPlaceholder: "销售额最小值",
+        endPlaceholder: "销售额最大值"
       }
     },
     {

+ 1 - 19
src/views/InvoiceSales/sheetOrderPool/index.vue

@@ -14,25 +14,7 @@ defineOptions({
 
 const detailDialogRef = ref<InstanceType<typeof DetailDialog>>(null);
 
-function searchCallback({ whx_range, dd_range }) {
-  const [start, end] = whx_range;
-  const [dstart, dend] = dd_range;
-
-  const result = {
-    start,
-    end,
-    dstart,
-    dend
-  };
-
-  return {
-    result,
-    deleteProps: ["whx_range", "dd_range"]
-  };
-}
-
-const { pageContentRef, handleResetClick, handleSearchClick } =
-  usePageSearch(searchCallback);
+const { pageContentRef, handleResetClick, handleSearchClick } = usePageSearch();
 
 onMounted(
   () =>

+ 4 - 1
src/views/interest/processPermission/components/process-list.vue

@@ -15,7 +15,10 @@ const list = ref<any>([...MOCK_PROCESS_DATA]);
 const rule_process_list = ref([]);
 
 //刷新流程
-watchEffect(() => (rule_process_list.value = ["89", "90"]));
+watchEffect(() => {
+  console.log(props.currentRole);
+  rule_process_list.value = ["89", "90"];
+});
 
 function handleSave() {
   emit("saveBtnClick", unref(rule_process_list));

+ 2 - 3
src/views/interest/processPermission/index.vue

@@ -12,10 +12,9 @@ function submit(actions: Array<string>) {
 
 <template>
   <div class="main role">
-    <div class="flex justify-between h-[calc(100vh-85px)] bg-white">
+    <div class="flex bg-white justify-between h-[calc(100vh-85px)]">
       <RoleList
-        min-w-200px
-        mr-5
+        class="min-w-200px mr-5"
         :current-role="currentRole"
         @change-current-role="role => (currentRole = role)"
       />