From 4cc27f93a1901e12eb12a198029911c483dd991f Mon Sep 17 00:00:00 2001
From: maven <2163098428@qq.com>
Date: 星期三, 27 八月 2025 14:30:57 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_JLMY' into dev_JLMY

---
 src/views/payable/components/PayableDialog.vue |  279 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 279 insertions(+), 0 deletions(-)

diff --git a/src/views/payable/components/PayableDialog.vue b/src/views/payable/components/PayableDialog.vue
new file mode 100644
index 0000000..f78af79
--- /dev/null
+++ b/src/views/payable/components/PayableDialog.vue
@@ -0,0 +1,279 @@
+<template>
+  <div>
+    <el-dialog
+        v-model="dialogPayableFormVisible"
+        :title="title"
+        width="600"
+        :close-on-click-modal="false"
+        @close="handleClose"
+    >
+      <el-form
+          ref="formRef"
+          :model="form"
+          :rules="rules"
+          label-width="auto"
+          class="production-form"
+          label-position="right"
+          style="max-width: 400px; margin: 0 auto"
+      >
+        <el-form-item label="鍙戠エ鍙�" prop="ticketNo">
+          <el-input
+              v-model.number="form.ticketNo"
+              placeholder="璇疯緭鍏ュ彂绁ㄥ彿"
+              :disabled="isViewMode"
+          >
+          </el-input>
+        </el-form-item>
+        <el-form-item label="浠樻閲戦" prop="paymentAmount">
+          <el-input
+              v-model.number="form.paymentAmount"
+              placeholder="璇疯緭鍏ヤ粯娆鹃噾棰�"
+              :disabled="isViewMode"
+          >
+             <template v-slot:suffix>
+              <i style="font-style: normal">鍏�</i>
+            </template>
+          </el-input>
+        </el-form-item>
+        <el-form-item label="浠樻绫诲瀷" prop="payableType">
+          <el-select
+              v-model="form.payableType"
+              placeholder="璇烽�夋嫨绫诲瀷"
+              :disabled="isViewMode"
+          >
+            <el-option
+                v-for="item in payableTypeList"
+                :key="item.value"
+                :label="item.label"
+                :value="Number(item.value)"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="涓婁紶闄勪欢" prop="attachUpload">
+          <el-upload
+              class="upload-demo"
+              drag
+              :fileList="form.fileList"
+              :action="uploadFileUrl"
+              :headers="headers"
+              :http-request="UploadImage"
+              :on-success="handleUploadSuccess"
+              :on-remove="handleUploadRemove"
+              :on-preview="handleUploadPreview"
+              multiple>
+            <i class="el-icon-upload"></i>
+            <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
+          </el-upload>
+        </el-form-item>
+        <el-form-item label="鐧昏浜�" prop="registrantId">
+          <el-input
+              :value="match(form.registrantId)"
+              v-model.number="form.registrantId"
+              disabled
+              placeholder="璇疯緭鍏�"
+          />
+        </el-form-item>
+        <el-form-item label="鐧昏鏃ユ湡" prop="registrationDate">
+          <el-date-picker
+              disabled
+              v-model="form.registrationDate"
+              type="date"
+              placeholder="YYYY-MM-DD"
+              style="width: 100%"
+              value-format="YYYY-MM-DD"
+          />
+        </el-form-item>
+
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <!-- 閲嶇疆鍜屽彇娑� -->
+          <el-button
+              @click="handleClose"
+              v-if="title.includes('鏂板') || title.includes('鏌ョ湅')"
+          >鍙栨秷
+          </el-button>
+          <el-button @click="handleReset" v-if="title.includes('缂栬緫')"
+          >閲嶇疆
+          </el-button>
+          <el-button type="primary" v-if="!isViewMode" @click="handleSubmit"
+          >纭</el-button
+          >
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="ProductionDialog">
+import {ref, defineProps, watch, onMounted, nextTick, computed,reactive,defineEmits} from "vue";
+import axios from "axios";
+import {addDuePayable} from "@/api/payable/index.js"
+import {ElMessage} from "element-plus";
+
+import useUserStore from "@/store/modules/user.js";
+import useDictStore from "@/store/modules/dict.js"
+import {getToken} from "@/utils/auth.js";
+const uploadFileUrl = computed(() => import.meta.env.VITE_APP_BASE_API + "/common/minioUploads");
+const headers = computed(() => ({ Authorization: "Bearer " + getToken() }));
+
+
+
+const props = defineProps({
+  title: {
+    type: String,
+    default: "",
+  },
+  statusType: { type: Number, default: 0 },
+  dialogPayableFormVisible: {
+    type: Boolean,
+    required: true
+  },
+});
+
+const handleUploadRemove = (it)=>{
+  form.value.fileList = form.value.fileList.filter(f => f.uid !== it.uid);
+
+}
+const handleUploadPreview = (it)=>{
+  const link = document.createElement("a");
+  if(it.url){
+    link.href = it.url
+  }else {
+    link.href = form.value.fileList.value.find(fl=>fl.uid === it.uid).url;
+  }
+  link.download = it.name;
+  link.click();
+}
+
+const handleUploadSuccess = (res,file)=>{
+  form.value.fileList.push(...res.data.map((it,index)=>{
+    return {
+      id:it.id,
+      url:it.downloadUrl,
+      name:it.originalFilename,
+      status:"success",
+      uid:file.uid
+    }
+  }))
+}
+
+// 鏂囦欢涓婁紶澶勭悊
+const UploadImage = (param) => {
+  const formData = new FormData();
+  formData.append("files", param.file);
+  formData.append("type", props.statusType);
+  axios.post(uploadFileUrl.value, formData, {
+    headers: {
+      "Content-Type": "multipart/form-data",
+      ...headers.value,
+    },
+    onUploadProgress: (progressEvent) => {
+      const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total);
+      param.onProgress({ percent });
+    },
+  })
+      .then((response) => {
+        if (response.data.code === 200) {
+          handleUploadSuccess(response.data, param.file);
+          ElMessage.success("涓婁紶鎴愬姛");
+        } else {
+          param.onError(new Error(response.data.msg));
+          ElMessage.error(response.data.msg);
+        }
+      })
+      .catch((error) => {
+        param.onError(error);
+      });
+};
+const emit = defineEmits(["update:dialogPayableFormVisible", "success"]);
+const dialogPayableFormVisible = defineModel("dialogPayableFormVisible", {
+  required: true,
+  type: Boolean,
+});
+const form = defineModel("form", {
+  required: true,
+  type: Object,
+});
+
+
+const payableTypeList = ref([])
+const isViewMode = computed(() => props.title.includes("鏌ョ湅"));
+
+const userStore = useUserStore();
+const userInfo = ref({});
+const match = () => {
+  return userInfo.value.nickName || "鏈煡鐢ㄦ埛";
+};
+
+
+
+
+//###
+
+onMounted(async () => {
+
+  payableTypeList.value = useDictStore().getDictTypeList("payable_type").map((item) => ({
+    value: item.value,
+    label: item.label,
+  }))
+
+  let res = await userStore.getInfo();
+  userInfo.value = res.user;
+
+});
+const rules = {
+
+  payableType: [
+    {required: true, message: "璇烽�夋嫨绫诲瀷", trigger: "change"}
+  ],
+  paymentAmount: [
+    {required: true, message: "璇疯緭鍏ラ噾棰�", trigger: "blur"}
+  ],
+  ticketNo: [
+    {required: true, message: "璇疯緭鍏ュ彂绁ㄥ彿", trigger: "blur"}
+  ]
+
+};
+// 鍏抽棴寮圭獥
+const handleClose = () => {
+  dialogPayableFormVisible.value = false;
+  form.value.fileList.value = []
+};
+
+const handleReset = async ()=>{
+
+}
+
+const formRef = ref(null);
+// 鎻愪氦琛ㄥ崟
+const handleSubmit = async () => {
+  // 鏂囦欢澶勭悊鍙幏鍙杋d 杩涜鎷兼帴
+  if (!formRef.value) return;
+  formRef.value.validate((valid) => {
+    if (valid) {
+      const obj = ref({});
+      form.value.attachUpload = ""
+      if (form.value.fileList.length > 0){
+        form.value.attachUpload = form.value.fileList.map(it => it.id).join(",")
+      }
+
+      let result = addDuePayable({
+        ...form.value
+      })
+
+      obj.value = {
+        ...form.value,
+        result
+      }
+      emit("success", obj.value);
+    }
+  })
+};
+
+</script>
+
+<style lang="scss" scoped>
+
+
+</style>

--
Gitblit v1.9.3