| .npmrc | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| dist.zip | 补丁 | 查看 | 原始文档 | blame | 历史 | |
| package.json | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/components/Pagination/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/components/StatisticsCards/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/followvisit/discharge/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/followvisit/mzsatisfaction/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/followvisit/record/detailpage/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/followvisit/zysatisfaction/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| tmp-img/crop.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| tmp-img/crop1.png | 补丁 | 查看 | 原始文档 | blame | 历史 | |
| vue.config.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
.npmrc
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,4 @@ # Node 17+ ç OpenSSL 3 ç§»é¤äº md4ï¼webpack4 / compression-webpack-plugin@5 建 hash æ¶ä¼æ¥ # error:0308010C:digital envelope routines::unsupported # è¿é让 npm è·èæ¬æ¶èªå¨å¸¦ä¸ legacy providerï¼æå»ºå½ä»¤ä¸ç¨åæå¨è®¾ç¯å¢åé node-options=--openssl-legacy-provider dist.zipBinary files differ
package.json
@@ -7,6 +7,7 @@ "scripts": { "dev": "vue-cli-service serve", "build:prod": "vue-cli-service build", "build:prod:legacy": "set NODE_OPTIONS=--openssl-legacy-provider&& vue-cli-service build", "build:stage": "vue-cli-service build --mode staging", "preview": "node build/index.js --preview", "lint": "eslint --ext .js,.vue src" src/components/Pagination/index.vue
@@ -79,7 +79,10 @@ }, pageSize: { get() { return this.limit // limit å¯è½è¢«â导åºâçæä½ä¸´æ¶ç½®ä¸º nullï¼ç´æ¥éä¼ ä¼è®© el-pagination ç®åº // pageCount = total / 0 = Infinityï¼é¡µç éå°±åºç° âinfinityâãè¿éå åºæ 10 const size = Number(this.limit) return size > 0 ? size : 10 }, set(val) { this.$emit('update:limit', val) src/components/StatisticsCards/index.vue
@@ -114,6 +114,7 @@ æ éé访: "no-follow-card", éé访: "need-follow-card", å¾ é访: "pending-card", åé失败: "failed-card", 已宿: "completed-card", ä½é¢æ»é: "total-card", é¨è¯æ»é: "total-card", @@ -255,6 +256,15 @@ } /* å¼å¸¸ - æµ çº¢è² */ /* åé失败 - æµ çº¢ */ .failed-card .el-card__body { background: #ffeaea; border-radius: 10px; } .failed-card .card-value { color: #e04040; } .error-card .el-card__body { background: #fce4ec; border-radius: 10px; src/views/followvisit/discharge/index.vue
@@ -1249,9 +1249,12 @@ { value: 1, label: "被é¢å" }, { value: 2, label: "å¾ åé" }, { value: 3, label: "å·²åé" }, { value: 5, label: "åé失败" }, { value: 7, label: "è¶ æ¶" }, ], }, { value: 40, // ä¸çº§ï¼åé失败ï¼åç¬ååºï¼æ¹ä¾¿ç´æ¥çï¼ label: "åé失败", }, { value: 20, // ä¸çº§ï¼å·²å®æ @@ -1303,6 +1306,10 @@ }, { name: "å¾ é访", value: 0, }, { name: "åé失败", value: 0, }, { @@ -1816,9 +1823,9 @@ this.cardlist[2].value = response.rows[0].ysf; this.ycvalue = Number(response.rows[0].yc) || 0; this.jgvalue = response.rows[0].jg; this.cardlist[3].value = response.rows[0].fssb; this.cardlist[4].value = response.rows[0].dsf; // this.cardlist[5].value = response.rows[0].yfs2; this.cardlist[3].value = response.rows[0].dsf; this.cardlist[4].value = response.rows[0].fssb; this.cardlist[5].value = response.rows[0].ywc; this.yfsvalue = response.rows[0].yfs; this.loading = false; this.userList.forEach((item) => { @@ -2060,6 +2067,11 @@ break; } this.topqueryParams.sendstate = null; // ä¸çº§ãåé失败ãï¼æç¶æ 5 ç´æ¥è¿æ»¤ï¼ä¸çåäºå¾ éè®¿ï¼ if (value === 40) { this.topqueryParams.sendstateView = null; this.topqueryParams.sendstate = 5; } } else { // éä¸äºäºçº§ï¼å ·ä½ç¶æï¼ this.topqueryParams.sendstateView = null; @@ -2438,11 +2450,16 @@ try { const res = await getTaskservelist(query); const row = (res && res.rows && res.rows[0]) || {}; // æ¥å£æ²¡è¿åç»è®¡è¡æ¶ä¿æåå¼ï¼é¿å 䏿¬¡å¼å¸¸æå¡çå ¨å·æ 0 if (!res || !res.rows || !res.rows.length) { return; } this.cardlist[0].value = Number(row.wxsf || 0) + Number(row.xsf || 0); this.cardlist[1].value = Number(row.wxsf) || 0; this.cardlist[2].value = Number(row.xsf) || 0; this.cardlist[3].value = Number(row.dsf) || 0; this.cardlist[4].value = Number(row.ywc) || 0; this.cardlist[4].value = Number(row.fssb) || 0; this.cardlist[5].value = Number(row.ywc) || 0; this.ycvalue = Number(row.yc) || 0; this.jgvalue = Number(row.jg) || 0; } catch (e) { @@ -2472,6 +2489,8 @@ query.sendstateView = 3; } else if (name === "å¾ é访") { query.sendstateView = 1; } else if (name === "åé失败") { query.sendstates = [5]; } else if (name === "已宿") { query.sendstateView = 2; } else if (name === "éé访") { src/views/followvisit/mzsatisfaction/index.vue
@@ -382,7 +382,8 @@ align="center" key="updateBy" prop="updateBy" width="120" min-width="120" :show-overflow-tooltip="true" /> <el-table-column label="é¨è¯æ»¡æåº¦æ¨¡æ¿åç§°" @@ -1811,6 +1812,9 @@ }, /** å¯¼åºæé®æä½ */ handleExport() { // 导åºéè¦å ¨éæ°æ®ï¼ä¸´æ¶å»æå页ï¼å¯¼åºåå¿ é¡»è¿åï¼å¦åå页ä¼ç®æ Infinityï¼é¡µç æ¾ç¤º infinityï¼ const originalPageNum = this.topqueryParams.pageNum; const originalPageSize = this.topqueryParams.pageSize; this.topqueryParams.pageNum = null; this.topqueryParams.pageSize = null; this.download( @@ -1819,7 +1823,11 @@ ...this.topqueryParams, }, `user_${new Date().getTime()}.xlsx` ); ).finally(() => { this.topqueryParams.pageNum = originalPageNum; this.topqueryParams.pageSize = originalPageSize; this.getList(); }); }, // å¼å¸¸å渲æ tableRowClassName({ row, rowIndex }) { src/views/followvisit/record/detailpage/index.vue
@@ -639,10 +639,16 @@ <el-button v-if="showQuestionnaireForm" type="primary" :disabled="!canSaveQuestionnaire" :loading="savingQuestion" @click="getdetail" >ä¿åé®å·è¯¦æ </el-button > <el-button v-else type="primary" @click="yuyingetdetail" <el-button v-else type="primary" :loading="savingQuestion" @click="yuyingetdetail" >ä¿åé®å·è¯¦æ </el-button > </div> @@ -700,10 +706,15 @@ <el-button v-if="Voicetype" type="primary" :loading="savingVoice" @click="yuyingetdetail" >ä¿åé访详æ </el-button > <el-button v-else type="primary" @click="getdetail" <el-button v-else type="primary" :loading="savingQuestion" @click="getdetail" >ä¿åé访详æ </el-button > </div> @@ -712,6 +723,38 @@ </div> </div> </div> <!-- æªéé项æç¤ºï¼å¤§åéç®æéï¼å è®¸ç¨æ·åæä¿å --> <el-dialog :visible.sync="confirmSaveVisible" width="640px" append-to-body :close-on-click-modal="false" custom-class="unanswered-dialog" > <div slot="title" class="unanswered-title"> <i class="el-icon-warning"></i> 注æï¼æé¢ç®æ²¡æéæ©é项 </div> <div class="unanswered-warn"> å½åé®å·è¿æ <span class="unanswered-count">{{ unansweredQuestions.length }}</span> éé¢<strong>没æéæ©ä»»ä½é项</strong>ï¼ç»§ç»ä¿åå°æâæªä½çâè®°å½ï¼ </div> <div class="unanswered-list"> <div v-for="q in unansweredQuestions" :key="q.index"> 第 {{ q.index }} é¢ï¼{{ q.title }} </div> </div> <div class="unanswered-tip">ç¡®å®è¿è¦ä¿ååï¼</div> <span slot="footer"> <el-button size="medium" @click="confirmSaveVisible = false" >è¿å补填</el-button > <el-button type="danger" size="medium" @click="confirmForceSave" >ä»è¦ä¿å</el-button > </span> </el-dialog> <!-- 人工å¤ç --> <div class="manual-action"> <div class="Followuserinfos"> @@ -1589,6 +1632,12 @@ "é¢çº¦ä¸æ¬¡å¤è¯", ], tableDatatop: [], //é¢ç®è¡¨ // ä¿åé®å·ï¼æªçé¢æç¤ºå¼¹çª / ç¨æ·åæä¿åæ è®° confirmSaveVisible: false, forceSave: false, // é²éå¤æäº¤ï¼ä¿åä¸ç¦ç¨æé® savingQuestion: false, savingVoice: false, voiceDatatop: [], //é¢ç®è¡¨ dynamicTags: [], isMergeMode: false, @@ -1742,6 +1791,26 @@ } }, computed: { // æ¯å¦æä»»æä¸éé¢ãéäºé项ãæãå¡«äºå¤æ³¨ã hasAnyAnswer() { return (this.tableDatatop || []).some((item) => this.isQuestionAnswered(item)); }, // å³ä¾§å¤çæè§/夿³¨æ¡æ¯å¦æå 容 hasRemarkText() { const remark = this.form && this.form.remark; return remark !== null && remark !== undefined && String(remark).trim() !== ""; }, // ä¿åé®å·è¯¦æ çå¯ç¹æ¡ä»¶ï¼é®å·æä½ç æ å³è¾¹å¤æ³¨æ¡æå å®¹ï¼æå ¶ä¸å³å¯ï¼ canSaveQuestionnaire() { return this.hasAnyAnswer || this.hasRemarkText; }, // 没æéæ©é项çé¢ç®ï¼ä¿ååç¨å¤§åéç®æç¤ºï¼ä¸åºåææ²¡æå¡«å¤æ³¨ï¼ // index ç¨é¢ç®å¨é®å·éçåå§åºå·ï¼æ¹ä¾¿å左边é®å·å¯¹ç § unansweredQuestions() { return (this.tableDatatop || []) .map((item, i) => ({ index: i + 1, title: item.scriptContent || "æªå½åé¢ç®", raw: item })) .filter((q) => !this.hasOptionValue(q.raw)); }, callStatusText() { if (this.customCallStatus) { return this.customCallStatus; @@ -2153,8 +2222,52 @@ } }); }, // é¢ç®æ¯å¦éäºé项ï¼åéå符串 / å¤éæ°ç»ï¼ hasOptionValue(item) { if (!item) { return false; } const val = item.scriptResult; if (Array.isArray(val)) { return val.some( (v) => v !== null && v !== undefined && String(v).trim() !== "" ); } return val !== null && val !== undefined && String(val).trim() !== ""; }, // é¢ç®æ¯å¦å¡«äºå¤æ³¨ hasRemarkValue(item) { if (!item) { return false; } const remark = item.answerps; return ( remark !== null && remark !== undefined && String(remark).trim() !== "" ); }, // é¢ç®æ¯å¦å·²ä½çï¼éäºé项 æ å¡«äºå¤æ³¨ï¼ä¸¤è æå ¶ä¸å³ç®å·²çï¼ isQuestionAnswered(item) { return this.hasOptionValue(item) || this.hasRemarkValue(item); }, // æªçé¢æç¤ºéç¹ãä»è¦ä¿åã confirmForceSave() { this.forceSave = true; this.confirmSaveVisible = false; this.getdetail(); }, // 廿¤äººåå卿°æ® getdetail() { // é®å·æ²¡ä½çãå³è¾¹å¤æ³¨æ¡ä¹ç©º â ä¸å 许ä¿å if (!this.canSaveQuestionnaire) { this.$message.warning("请å å¨é®å·ä¸ä½çï¼æå¨å³ä¾§å¡«åå¤çæè§/夿³¨"); return; } // è¿æé¢ç®æ²¡ä½çï¼å¤§åæç¤ºï¼ç¨æ·åææç»§ç» if (this.unansweredQuestions.length > 0 && !this.forceSave) { this.confirmSaveVisible = true; return; } this.forceSave = false; console.log(1); let excep = ""; @@ -2209,6 +2322,11 @@ param6: this.id, type: 2, }; // é²éå¤æäº¤ï¼ä¿åä¸å次ç¹å»ç´æ¥å¿½ç¥ if (this.savingQuestion) { return; } this.savingQuestion = true; savequestiondetail(obj).then((res) => { if (res.code == 200) { this.$modal.msgSuccess("æå¡ä¿åæå"); @@ -2251,6 +2369,8 @@ }); } } }).finally(() => { this.savingQuestion = false; }); }, Torouter() { @@ -2554,6 +2674,11 @@ type: 1, }; console.log("c", 4); // é²éå¤æäº¤ï¼ä¿åä¸å次ç¹å»ç´æ¥å¿½ç¥ if (this.savingVoice) { return; } this.savingVoice = true; const orgName = localStorage.getItem("orgname"); console.log(orgName, "orgName"); @@ -2596,6 +2721,8 @@ this.Torouter(); }); } }).finally(() => { this.savingVoice = false; }); }, // 忬¡éè®¿æ°æ®æ´æ¿ @@ -4431,4 +4558,53 @@ margin-bottom: 12px; } } /* æªéé项æç¤ºï¼å¤§åéç®æé */ .unanswered-title { font-size: 22px; font-weight: 700; color: #f56c6c; display: flex; align-items: center; } .unanswered-title i { font-size: 26px; margin-right: 10px; } .unanswered-warn { font-size: 20px; font-weight: 600; color: #303133; line-height: 1.8; } .unanswered-warn strong { color: #f56c6c; font-size: 22px; } .unanswered-count { font-size: 40px; font-weight: 700; color: #f56c6c; margin: 0 6px; vertical-align: middle; } .unanswered-list { margin-top: 14px; max-height: 300px; overflow-y: auto; padding: 12px 16px; background: #fef0f0; border: 1px solid #fbc4c4; border-radius: 6px; font-size: 18px; line-height: 2; color: #303133; } .unanswered-tip { margin-top: 18px; font-size: 22px; font-weight: 700; color: #f56c6c; text-align: center; } </style> src/views/followvisit/zysatisfaction/index.vue
@@ -413,7 +413,8 @@ align="center" key="updateBy" prop="updateBy" width="120" min-width="120" :show-overflow-tooltip="true" /> <el-table-column label="ä½é¢æ»¡æåº¦æ¨¡æ¿åç§°" @@ -1899,6 +1900,9 @@ }, /** å¯¼åºæé®æä½ */ handleExport() { // 导åºéè¦å ¨éæ°æ®ï¼ä¸´æ¶å»æå页ï¼å¯¼åºåå¿ é¡»è¿åï¼å¦åå页ä¼ç®æ Infinityï¼é¡µç æ¾ç¤º infinityï¼ const originalPageNum = this.topqueryParams.pageNum; const originalPageSize = this.topqueryParams.pageSize; this.topqueryParams.pageNum = null; this.topqueryParams.pageSize = null; this.download( @@ -1907,7 +1911,11 @@ ...this.buildScopePayload(this.topqueryParams), }, `user_${new Date().getTime()}.xlsx` ); ).finally(() => { this.topqueryParams.pageNum = originalPageNum; this.topqueryParams.pageSize = originalPageSize; this.getList(); }); }, // å¼å¸¸å渲æ tableRowClassName({ row, rowIndex }) { tmp-img/crop.py
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,11 @@ from PIL import Image src = r"C:\Users\86176\.dsh\attachments\v1\objects\20\20844c3f5c9a090e1010da3d62ae091792c3e25fad6bdd38cc991b054f020d95" out = r"D:\daima\smartor\smartor-web\tmp-img\crop1.png" img = Image.open(src) print("size", img.size) # ç®å¤´å¤´é¨éè¿åºå box = (1050, 130, 1450, 420) crop = img.crop(box) crop = crop.resize((crop.width * 3, crop.height * 3), Image.LANCZOS) crop.save(out) print("saved", out, crop.size) tmp-img/crop1.png
vue.config.js
@@ -63,6 +63,11 @@ }, configureWebpack: { name: name, // Node 17+ ç OpenSSL 3 å»æäº md4ï¼webpack4 é»è®¤ç¨ md4 ç® hash 伿¥ // error:0308010C:digital envelope routines::unsupportedï¼è¿éæ¢æ sha256 output: { hashFunction: 'sha256' }, resolve: { alias: { '@': resolve('src')