Forráskód Böngészése

Merge branch 'master-charge' of http://git.yujin.shuziyunyao.com/yujin/digital-medicine-front into master-charge

huangxw 4 hónapja
szülő
commit
5ff145480b

+ 8 - 0
src/api/training/index.ts

@@ -122,3 +122,11 @@ export const confirmSigPublicPay = (id: any): AxiosPromise => {
         method: 'get',
     });
 };
+// 上传发票
+export const uploadInvoice = (data: any): AxiosPromise => {
+    return request({
+        url: `/dgtmedicine/trainingSignup/uploadInvoice`,
+        method: 'post',
+        data
+    });
+};

+ 14 - 15
src/views/training/meeting-add/index.vue

@@ -137,17 +137,17 @@
                                 </el-form-item>
                             </el-col>
                             <el-col :span="6">
-                                <div class="d-flex" style="align-items: flex-end;">
+                                <div class="d-flex flex-cln j-st" style="">
                                     <el-form-item label="发放积分" prop="pointsFlag" class="">
                                         <el-radio-group v-model="form.pointsFlag" style="flex-wrap: nowrap">
                                             <el-radio label="1">是</el-radio>
                                             <el-radio label="0">否</el-radio>
                                         </el-radio-group>
                                     </el-form-item>
-                                    <el-form-item label="" prop="points" v-if="form.pointsFlag == '1'" class="flex1 pl-10">
-                                        <div class="d-flex f-s-14">
+                                    <el-form-item label="" prop="points" v-if="form.pointsFlag == '1'" class="flex1">
+                                        <div class="d-flex f-s-14" style="white-space: nowrap;">
                                             <div>每成功参会(签到成功)1人发放</div>
-                                            <el-input v-model="form.points" style="width: 60px" />
+                                            <el-input v-model="form.points" style="width: 45px" />
                                             <div>个单位积分。</div>
                                         </div>
                                     </el-form-item>
@@ -165,7 +165,7 @@
                                 <el-form-item prop="meetingCharge.pricing" v-if="form.meetingCharge.hasFee == '1'">
                                     <div class="d-flex">
                                         <div class="c-#606266 f-w-6" style="">收费标准:</div>
-                                        <el-input class="flex1 pl-5" v-model.number="form.meetingCharge.pricing" maxlength="20" placeholder="请输入收费标准" clearable style="max-width: 200px;" />
+                                        <el-input class="flex1 pl-5" v-model="form.meetingCharge.pricing" maxlength="20" placeholder="请输入收费标准" clearable style="max-width: 200px;" />
                                         <div class="pl-10">元/人</div>
                                     </div>
                                 </el-form-item>
@@ -173,7 +173,10 @@
                                     <div>
                                         <el-radio-group v-model="form.meetingCharge.hasFlatFee" style="display: flex;flex-direction: column;align-items: flex-start;">
                                             <el-radio label="0">所有人统一收取标准费用</el-radio>
-                                            <el-radio label="1">按报名人员类型收取,不同人员收取不同费用<span class="c-999">(不作设置默认统一收取标准费用。)</span></el-radio>
+                                            <el-radio label="1">
+                                                按报名人员类型收取,不同人员收取不同费用
+                                                <span class="c-999">(不作设置默认统一收取标准费用。)</span>
+                                            </el-radio>
                                         </el-radio-group>
                                     </div>
                                 </el-form-item>
@@ -185,13 +188,12 @@
                                                 <el-select v-model="item.certType" placeholder="" clearable style="width: 100px">
                                                     <el-option v-for="item in hasPartialFree" :key="item.value" :label="item.label" :value="item.value" />
                                                 </el-select>
-                                                <div class="pl-10 f-s-14">免费</div>
                                                 <div v-if="+item?.certType" class="d-flex a-c">
                                                     <div v-if="item.vipLevel != 'P'" class="pl-10 f-s-14" style="white-space: nowrap;">每个单位免费</div>
                                                     <div v-else class="pl-10 f-s-14" style="white-space: nowrap;">免费</div>
-                                                    <el-input class="pl-10" v-model="item.total" maxlength="20" placeholder="请输入免费人数" style="width: 150px" :disabled="!+item.check"/>
+                                                    <el-input class="pl-10" v-model="item.total" maxlength="20" placeholder="请输入免费人数" style="width: 130px" :disabled="!+item.check" />
                                                     <div class="f-s-14" style="white-space: nowrap;">人,其余每人收费</div>
-                                                    <el-input class="pl-10" v-model="item.cost" maxlength="20" placeholder="请输入费用" style="width: 150px" :disabled="!+item.check"/>
+                                                    <el-input class="pl-10" v-model="item.cost" maxlength="20" placeholder="请输入费用" style="width: 130px" :disabled="!+item.check" />
                                                     <div f-s-14>元</div>
                                                 </div>
                                             </div>
@@ -364,10 +366,10 @@ const fixedField = ref<FieldDefinition[]>([{
     required: '1'
 }])
 const hasPartialFree = ref([{
-    label: '全部',
+    label: '全部免费',
     value: '0'
 }, {
-    label: '部分',
+    label: '部分免费',
     value: '1'
 }])
 const scrollOptions = {
@@ -563,10 +565,7 @@ const rules = reactive({
         }
     ],
     'meetingCharge.hasFee': [{ required: true, message: '请选择是否收取参会费用', trigger: 'change' }],
-    'meetingCharge.pricing': [{ required: true, message: '请输入收费标准', trigger: 'blur' }, {
-        type: 'number',  // 正确的配置方式:作为单独的验证规则
-        message: '收费标准必须为数字'
-    }],
+    'meetingCharge.pricing': [{ required: true, message: '请输入收费标准', trigger: 'blur' }],
     'meetingCharge.hasFlatFee': [{ required: true, message: '请选择收费标准', trigger: 'change' }],
     certFlag: [{ required: true, message: '请选择是否颁发证书', trigger: 'change' }],
     certificateInfo: [{ required: true, message: '请选择证书名称', trigger: 'change' }],

+ 45 - 14
src/views/training/models/meeting-detail-attend.vue

@@ -113,7 +113,7 @@
                     <div v-if="row.payType === '2'">对公转账</div>
                 </template>
             </vxe-column>
-            <vxe-column title="支付状态" field="remark" min-width="100" :formatter="colNoData">
+            <vxe-column title="支付状态" field="outTradeNo" min-width="100" :formatter="colNoData">
                 <template #default="{ row }">
                     {{ selectDictLabel(dm_pay_status, row?.payStatus)}}
                     <el-tooltip :content="`系统单号${row?.outTradeNo}`" placement="top" effect="light">
@@ -121,7 +121,12 @@
                     </el-tooltip>
                 </template>
             </vxe-column>
-            <vxe-column title="开票信息" field="remark" min-width="100" :formatter="colNoData" ></vxe-column>
+            <vxe-column title="开票信息" field="remark" min-width="100" :formatter="colNoData">
+                <template #default="{ row }">
+                    <div v-if="row.payStatus == '1'&& !+row?.invoiceStatus" @click="checkInvoiceData(row.invoiceInfo)" class="pointer">查看</div>
+                    <div v-if="row.payStatus == '1' && +row?.invoiceStatus" @click="checkInvoiceData(row.invoiceInfo)" class="pointer">已开票,点击查看</div>
+                </template>
+            </vxe-column>
             <vxe-column title="特殊说明" min-width="100" fixed="right">
                 <template #default="{ row }">
                     {{ +row?.tempJoin?'通过临时报名通道报名':'-' }}
@@ -142,16 +147,23 @@
             <vxe-column v-if="form?.conditions?.totalCheck == '1' || form?.meetingCharge?.hasFee == '1'" title="操作" width="250" align="center" fixed="right">
                 <template #default="{ row }">
                     <el-button type="danger" size="small" v-if="row?.res !== '0' && row?.signInFlag !=='1' && form?.conditions?.totalCheck == '1'&& row?.payStatus == '1' && form?.meetingCharge?.hasFee !== '1'" @click="openDialog(row)" style="color: white">重审</el-button>
-                    <el-button size="small" color="#33aeeb" @click="openDialog(row)" style="color: white" v-if="row?.res == '0' && form?.conditions?.totalCheck == '1'&& row?.payStatus == '1'">审核</el-button>
+                    <el-button size="small" color="#33aeeb" @click="openDialog(row)" style="color: white" v-if="row?.res == '0' && form?.conditions?.totalCheck == '1'&& row?.payStatus == '1' &&form?.trainingStatus !== '2'">审核</el-button>
                     <el-button v-if="row.payStatus !== '1'" size="small" color="#e99d42" style="color: white" @click="openModification(row)">修改费用金额</el-button>
                     <el-button v-if="row.payType === '2'&& row.payStatus !== '1'" size="small" color="#81b337" style="color: white" @click="openTransfer(row)">确认收到转账</el-button>
-                    <div v-if="row.payStatus == '1' &&row?.res !== '0'&& row?.trainingStatus == '2'">用户报名未成功,请至微信商户号进行退款</div>
+                    <div v-if="row.payStatus == '1' && row?.res == '0'&& form?.trainingStatus == '2'">用户报名未成功,请至微信商户号进行退款</div>
                     <div v-if="row.payType === '10'">该报名已退款</div>
+                    <el-upload v-if="form?.trainingStatus == '2' && row.payStatus == '1' && +row?.hasInvoice && !+row?.invoiceStatus && row.payType !== '10'" class="upload-demo" :action="uploadFileUrl" multiple :limit="1" :on-success="handleSuccess" :headers="headers" :show-file-list="false" accept=".pdf,.PDF">
+                        <el-button size="small" color="#33aeeb" style="color: white" @click=" invoiceId = row.id">上传发票</el-button>
+                    </el-upload>
+                    <el-upload v-if="form?.trainingStatus == '2' && row.payStatus == '1' && +row?.hasInvoice && +row?.invoiceStatus && row.payType !== '10'" class="upload-demo" :action="uploadFileUrl" multiple :limit="1" :on-success="handleSuccess" :headers="headers" :show-file-list="false" accept=".pdf,.PDF">
+                        <el-button type="primary">重新上传</el-button>
+                    </el-upload>
                 </template>
             </vxe-column>
         </vxe-table>
         <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
     </div>
+
     <el-dialog v-model="dialogVisible" title="审核信息" width="500" center>
         <el-form ref="formRef" :model="fromvalue" :rules="rules" label-width="80px">
             <el-form-item label="审核结果" prop="res">
@@ -194,42 +206,43 @@
             </div>
         </template>
     </el-dialog>
-    <el-dialog v-model="invoicingInformation" title="开票信息" width="360" center>
+    <el-dialog v-model="invoicingInformation" title="开票信息" width="600" center>
         <div class="d-flex a-c j-sb pt-10 pb-10 f-s-16">
             <div>名称:</div>
-            <div>123</div>
+            <div>{{ invoiceData?.headTitle || '-' }}</div>
         </div>
         <div class="d-flex a-c j-sb pt-10 pb-10 f-s-16">
             <div>税号:</div>
-            <div>123131312321313123123</div>
+            <div>{{ invoiceData?.taxSn || '-'}}</div>
         </div>
         <div class="d-flex a-c j-sb pt-10 pb-10 f-s-16">
             <div>单位地址:</div>
-            <div>萨达</div>
+            <div>{{ invoiceData?.address || '-'}}</div>
         </div>
         <div class="d-flex a-c j-sb pt-10 pb-10 f-s-16">
             <div>电话号码:</div>
-            <div>17754441247</div>
+            <div>{{ invoiceData?.contactPhone || '-'}}</div>
         </div>
         <div class="d-flex a-c j-sb pt-10 pb-10 f-s-16">
             <div>开户银行:</div>
-            <div>工行</div>
+            <div>{{ invoiceData?.bankName || '-'}}</div>
         </div>
         <div class="d-flex a-c j-sb pt-10 pb-10 f-s-16">
             <div>银行账户:</div>
-            <div>123131312321313123123</div>
+            <div>{{ invoiceData?.bankAccount || '-'}}</div>
         </div>
     </el-dialog>
     <registrationInfo v-if="showTemporary" v-model:show="showTemporary" :info="temporaryRegistration"></registrationInfo>
 </template>
 <script setup name="MeetingDetailInfo" lang="ts">
-import { exportTrainingMembers, signupApproval, signupCount, trainingMembers,editPrice,confirmSigPublicPay} from '@/api/training';
+import { exportTrainingMembers, signupApproval, signupCount, trainingMembers,editPrice,confirmSigPublicPay,uploadInvoice} from '@/api/training';
 import { colNoData } from '@/utils/noData';
 import { searchTabs } from '@/views/models';
 import { debounce } from 'lodash';
 import { onMounted, reactive, ref } from 'vue';
 import registrationInfo from './registration-info.vue';
 import { AreaCascader } from '@/views/components';
+import { globalHeaders } from '@/utils/request';
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { cpy_res_status, lm_signup_status_app_show, dm_check_join_type,temp_join_type,dm_pay_status } = toRefs<any>(proxy?.useDict('cpy_res_status', 'lm_signup_status_app_show', 'dm_check_join_type','temp_join_type','dm_pay_status'));
 // 获取详情
@@ -239,7 +252,8 @@ const props = defineProps({
         default: () => ({})
     }
 });
-
+const baseUrl = import.meta.env.VITE_APP_BASE_API;
+const uploadFileUrl = ref(baseUrl + '/resource/oss/upload'); // 上传文件服务器地址
 const rules = reactive({
     res: [
         { required: true, message: '请选择审核结果', trigger: 'blur' }
@@ -259,10 +273,17 @@ const showTransfer = ref(false)
 const participationFee = ref()
 const editPricedata = ref()
 const invoicingInformation = ref(false)
+const invoiceData = ref()
+const invoiceId = ref()
+const headers = ref(globalHeaders());
 const fromvalue = ref({
     targetId: '',
     msg: ''
 })
+const checkInvoiceData = (row)=>{
+    invoicingInformation.value = true
+    invoiceData.value = row
+}
 const checkRegostrationInfo = (row) => {
     temporaryRegistration.value = row;
     showTemporary.value = true;
@@ -345,7 +366,17 @@ const changeEditPrice = async ()=>{
     modiFication.value = false
     getList();
 }
-
+const handleSuccess = async(res,uploadFile)=>{
+    await uploadInvoice({
+        id:invoiceId.value,
+        invoiceUrl:{
+            fileName:res.data.fileName,
+            url:res.data.fileName,
+            fileSize:uploadFile.raw.size
+        }
+    })
+    getList();
+}
 onMounted(() => {
     getList();
     getExpertPersonCount();