From 1bdbc7be81b9374d7bf8587e43479ce98dfe9042 Mon Sep 17 00:00:00 2001 From: wwl <xchao828@163.com> Date: 星期二, 12 八月 2025 09:04:54 +0800 Subject: [PATCH] ‘’ --- src/main.js | 115 ++++--- src/views/hosp/hosp/index.vue | 737 +++++++++++++++--------------------------------- 2 files changed, 304 insertions(+), 548 deletions(-) diff --git a/src/main.js b/src/main.js index e85e3f5..d44920f 100644 --- a/src/main.js +++ b/src/main.js @@ -150,58 +150,73 @@ router, store, render: (h) => h(App), - mounted() { - const token = store.state.user.token || Cookies.get('token') || ''; - if (token && !isWebSocketInitialized) { - console.log('鍒濆鍖� WebSocket锛孴oken:', token); - isWebSocketInitialized = true; - initWebSocket(token, (type, data) => { - console.log('WebSocket 鏀跺埌娑堟伅:', { type, data }); // 璋冭瘯锛氳褰曞師濮嬫暟鎹� - if (type === 'error') { - Vue.prototype.$showNotification.call(this, 'error', '閿欒', data); - return; - } - try { - if (typeof data === 'string' && data.trim().startsWith('{')) { - // 鏇挎崲澶ф暣鏁板瓧娈碉紝闃叉绮惧害涓㈠け - const normalizedData = data.replace(/"(noticeId|notice_id|id)":\s*(\d+)/g, '"$1":"$2"'); - const message = JSON.parse(normalizedData); - console.log('WebSocket 瑙f瀽鍚庢秷鎭�:', message); // 璋冭瘯锛氳褰曡В鏋愬悗鐨勬秷鎭� - if (message.noticeId || message.notice_id || message.id) { - const noticeTypeLabel = message.noticeType === '1' ? '閫氱煡' : '鍏憡'; - const noticeTitle = message.noticeTitle ? message.noticeTitle.replace(/<[^>]+>/g, '') : '鏃犳爣棰�'; - const contentPreview = message.noticeContent - ? message.noticeContent.replace(/<[^>]+>/g, '').substring(0, 20) + '...' - : '鏃犲唴瀹�'; - const noticeId = String(message.noticeId || message.notice_id || message.id); - console.log('鍑嗗瑙﹀彂閫氱煡锛宯oticeId:', noticeId, 'type:', typeof noticeId); // 璋冭瘯锛氳褰曚紶閫掔殑 noticeId - Vue.prototype.$showNotification.call( - this, - 'success', - `鏂�${noticeTypeLabel}`, - `${noticeTitle} - ${contentPreview}`, - null, - noticeId - ); - } else { - console.log('鏈煡娑堟伅绫诲瀷:', message); - Vue.prototype.$showNotification.call(this, 'info', '娑堟伅', '鏀跺埌鏈煡鏍煎紡鐨勬秷鎭�'); + mounted() { + const token = store.state.user.token || Cookies.get('token') || ''; + if (token) { + // 璋冪敤 getConfigKey 鎺ュ彛锛屾鏌� xxtz 閰嶇疆 + getConfigKey('xxtz').then(res => { + console.log('getConfigKey 杩斿洖缁撴灉:', res); // 璋冭瘯锛氳褰曟帴鍙e搷搴� + if (res.msg === 'Y') { + // 娑堟伅閫氱煡鍔熻兘寮�鍚� + console.log('娑堟伅閫氱煡鍔熻兘宸插惎鐢�'); + if (!isWebSocketInitialized) { + console.log('鍒濆鍖� WebSocket锛孴oken:', token); + isWebSocketInitialized = true; + initWebSocket(token, (type, data) => { + console.log('WebSocket 鏀跺埌娑堟伅:', { type, data }); // 璋冭瘯锛氳褰曞師濮嬫暟鎹� + if (type === 'error') { + Vue.prototype.$showNotification.call(this, 'error', '閿欒', data); + return; } - } else { - console.log('WebSocket 闈� JSON 娑堟伅:', data); - - } - } catch (error) { - console.error('娑堟伅瑙f瀽澶辫触:', error, '鍘熷鏁版嵁:', data); - Vue.prototype.$showNotification.call(this, 'error', '娑堟伅瑙f瀽澶辫触', `鏈嶅姟鍣ㄥ洖搴斿瓧绗︿覆: ${data}`); + try { + if (typeof data === 'string' && data.trim().startsWith('{')) { + // 鏇挎崲澶ф暣鏁板瓧娈碉紝闃叉绮惧害涓㈠け + const normalizedData = data.replace(/"(noticeId|notice_id|id)":\s*(\d+)/g, '"$1":"$2"'); + const message = JSON.parse(normalizedData); + console.log('WebSocket 瑙f瀽鍚庢秷鎭�:', message); // 璋冭瘯锛氳褰曡В鏋愬悗鐨勬秷鎭� + if (message.noticeId || message.notice_id || message.id) { + const noticeTypeLabel = message.noticeType === '1' ? '閫氱煡' : '鍏憡'; + const noticeTitle = message.noticeTitle ? message.noticeTitle.replace(/<[^>]+>/g, '') : '鏃犳爣棰�'; + const contentPreview = message.noticeContent + ? message.noticeContent.replace(/<[^>]+>/g, '').substring(0, 20) + '...' + : '鏃犲唴瀹�'; + const noticeId = String(message.noticeId || message.notice_id || message.id); + console.log('鍑嗗瑙﹀彂閫氱煡锛宯oticeId:', noticeId, 'type:', typeof noticeId); // 璋冭瘯锛氳褰曚紶閫掔殑 noticeId + Vue.prototype.$showNotification.call( + this, + 'success', + `鏂�${noticeTypeLabel}`, + `${noticeTitle} - ${contentPreview}`, + null, + noticeId + ); + } else { + console.log('鏈煡娑堟伅绫诲瀷:', message); + Vue.prototype.$showNotification.call(this, 'info', '娑堟伅', '鏀跺埌鏈煡鏍煎紡鐨勬秷鎭�'); + } + } else { + console.log('WebSocket 闈� JSON 娑堟伅:', data); + } + } catch (error) { + console.error('娑堟伅瑙f瀽澶辫触:', error, '鍘熷鏁版嵁:', data); + Vue.prototype.$showNotification.call(this, 'error', '娑堟伅瑙f瀽澶辫触', `鏈嶅姟鍣ㄥ洖搴斿瓧绗︿覆: ${data}`); + } + }); + } else { + console.log('WebSocket 宸插垵濮嬪寲锛岃烦杩囬噸澶嶈繛鎺�'); } - }); - } else if (!token) { - console.error('鏈壘鍒� token锛屾棤娉曞垵濮嬪寲 WebSocket'); - } else { - console.log('WebSocket 宸插垵濮嬪寲锛岃烦杩囬噸澶嶈繛鎺�'); - } - }, + } else { + console.log('娑堟伅閫氱煡鍔熻兘鏈惎鐢� (xxtz: N)'); + } + }).catch(error => { + console.error('璋冪敤 getConfigKey 澶辫触:', error); + // 鍙�夛細鏍规嵁闇�姹傚鐞嗘帴鍙h皟鐢ㄥけ璐ョ殑鎯呭喌 + Vue.prototype.$showNotification.call(this, 'error', '閰嶇疆鑾峰彇澶辫触', '鏃犳硶鑾峰彇娑堟伅閫氱煡閰嶇疆'); + }); + } else { + console.error('鏈壘鍒� token锛屾棤娉曞垵濮嬪寲 WebSocket'); + } +}, beforeDestroy() { if (isWebSocketInitialized) { closeWebSocket(); diff --git a/src/views/hosp/hosp/index.vue b/src/views/hosp/hosp/index.vue index b1afb15..a8af97f 100644 --- a/src/views/hosp/hosp/index.vue +++ b/src/views/hosp/hosp/index.vue @@ -1,476 +1,152 @@ <template> <div class="app-container"> - <el-form - :model="queryParams" - ref="queryForm" - size="small" - :inline="true" - v-show="showSearch" - label-width="68px" - > + <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> <el-form-item label="闄㈠尯鍚嶇О" prop="hospAreaName"> - <el-input - style="width: 160px" - v-model="queryParams.hospAreaName" - placeholder="璇疯緭鍏ラ櫌鍖哄悕绉�" - clearable - @keyup.enter.native="handleQuery" - /> + <el-input style="width: 160px" v-model="queryParams.hospAreaName" placeholder="璇疯緭鍏ラ櫌鍖哄悕绉�" clearable + @keyup.enter.native="handleQuery" /> </el-form-item> - <!-- <el-form-item label="鏈烘瀯ID" prop="hospid"> - <el-input v-model="queryParams.hospid" placeholder="璇疯緭鍏ユ満鏋処D" clearable @keyup.enter.native="handleQuery"/> - </el-form-item> --> <el-form-item label="鏈烘瀯鍚嶇О" prop="hospName"> - <el-input - v-model="queryParams.hospName" - style="width: 160px" - placeholder="璇疯緭鍏ユ満鏋勫悕绉�" - clearable - @keyup.enter.native="handleQuery" - /> + <el-input v-model="queryParams.hospName" style="width: 160px" placeholder="璇疯緭鍏ユ満鏋勫悕绉�" clearable + @keyup.enter.native="handleQuery" /> </el-form-item> - <!-- <el-form-item label="闄㈠尯缂栫爜" prop="code"> - <el-input v-model="queryParams.code" placeholder="璇疯緭鍏ラ櫌鍖虹紪鐮�" clearable @keyup.enter.native="handleQuery"/> - </el-form-item> --> - <!-- <el-form-item label="鍖哄垝ID" prop="areaid"> - <el-input v-model="queryParams.areaid" placeholder="璇疯緭鍏ュ尯鍒扞D" clearable @keyup.enter.native="handleQuery" style="width:180px"/> - </el-form-item> --> <el-form-item label="鍖哄垝鍚嶇О" prop="areaName"> - <el-input - v-model="queryParams.areaName" - placeholder="璇疯緭鍏ュ尯鍒掑悕绉�" - clearable - @keyup.enter.native="handleQuery" - style="width: 180px" - /> + <el-input v-model="queryParams.areaName" placeholder="璇疯緭鍏ュ尯鍒掑悕绉�" clearable @keyup.enter.native="handleQuery" + style="width: 180px" /> </el-form-item> <el-form-item label="涓婚櫌鍖�" prop="mainHospArea"> - <el-select - v-model="queryParams.mainHospArea" - placeholder="鏄惁涓婚櫌鍖�" - clearable - style="width: 110px" - > - <el-option - v-for="dict in dict.type.sys_yes_no" - :key="dict.value" - :label="dict.label" - :value="dict.value" - /> + <el-select v-model="queryParams.mainHospArea" placeholder="鏄惁涓婚櫌鍖�" clearable style="width: 110px"> + <el-option v-for="dict in dict.type.sys_yes_no" :key="dict.value" :label="dict.label" :value="dict.value" /> </el-select> </el-form-item> <el-form-item label="璐熻矗浜�" prop="principal"> - <el-input - v-model="queryParams.principal" - placeholder="璇疯緭鍏ヨ礋璐d汉" - clearable - @keyup.enter.native="handleQuery" - style="width: 140px" - /> + <el-input v-model="queryParams.principal" placeholder="璇疯緭鍏ヨ礋璐d汉" clearable @keyup.enter.native="handleQuery" + style="width: 140px" /> </el-form-item> - <!-- <el-form-item label="缂栧埗搴婁綅" prop="plaitBed"> - <el-input v-model="queryParams.plaitBed" placeholder="璇疯緭鍏ョ紪鍒跺簥浣�" clearable @keyup.enter.native="handleQuery"/> - </el-form-item> --> - <!-- <el-form-item label="寮�鏀惧簥浣�" prop="openBed"> - <el-input v-model="queryParams.openBed" placeholder="璇疯緭鍏ュ紑鏀惧簥浣�" clearable @keyup.enter.native="handleQuery"/> - </el-form-item> --> - <!-- <el-form-item label="鎺掑簭" prop="orderNum"> - <el-input v-model="queryParams.orderNum" placeholder="璇疯緭鍏ユ帓搴�" clearable @keyup.enter.native="handleQuery"/> - </el-form-item> --> <el-form-item> - <el-button - type="primary" - icon="el-icon-search" - size="mini" - @click="handleQuery" - >鎼滅储</el-button - > - <el-button icon="el-icon-refresh" size="mini" @click="resetQuery" - >閲嶇疆</el-button - > + <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button> + <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button> </el-form-item> </el-form> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> - <el-button - type="primary" - icon="el-icon-plus" - size="mini" - @click="handleAdd" - v-hasPermi="['hosp:hosp:add']" - >鏂板</el-button - > + <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd" + v-hasPermi="['hosp:hosp:add']">鏂板</el-button> </el-col> <el-col :span="1.5"> - <el-button - type="primary" - icon="el-icon-edit" - size="mini" - :disabled="single" - @click="handleUpdate" - v-hasPermi="['hosp:hosp:edit']" - >淇敼</el-button - > + <el-button type="primary" icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate" + v-hasPermi="['hosp:hosp:edit']">淇敼</el-button> </el-col> <el-col :span="1.5"> - <el-button - type="primary" - icon="el-icon-delete" - size="mini" - :disabled="multiple" - @click="handleDelete" - v-hasPermi="['hosp:hosp:remove']" - >鍒犻櫎</el-button - > + <el-button type="primary" icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete" + v-hasPermi="['hosp:hosp:remove']">鍒犻櫎</el-button> </el-col> <el-col :span="1.5"> - <el-button - type="primary" - icon="el-icon-download" - size="mini" - @click="handleExport" - v-hasPermi="['hosp:hosp:export']" - >瀵煎嚭</el-button - > + <el-button type="primary" icon="el-icon-download" size="mini" @click="handleExport" + v-hasPermi="['hosp:hosp:export']">瀵煎嚭</el-button> </el-col> - <right-toolbar - :showSearch.sync="showSearch" - @queryTable="getList" - ></right-toolbar> + <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> </el-row> - <el-table - v-loading="loading" - :data="hospList" - @selection-change="handleSelectionChange" - border - > + <el-table v-loading="loading" :data="hospList" @selection-change="handleSelectionChange" border> <el-table-column type="selection" width="55" align="center" fixed /> - <el-table-column - label="搴忓彿" - align="center" - prop="newID" - width="50px" - fixed="left" - /> - <el-table-column - label="闄㈠尯鍚嶇О" - align="center" - prop="hospAreaName" - width="120px" - :show-overflow-tooltip="true" - fixed="left" - /> - <!-- <el-table-column label="鍖荤枟鏈烘瀯ID" align="center" prop="hospid" /> --> - <!-- <el-table-column label="鍖荤枟鏈烘瀯鍚嶇О" align="center" prop="hospName" /> --> - <el-table-column - label="闄㈠尯缂栫爜" - align="center" - prop="code" - :show-overflow-tooltip="true" - /> - <el-table-column - label="浜旂瑪绠�鐮�" - align="center" - prop="wbm" - :show-overflow-tooltip="true" - /> - <el-table-column - label="鎷奸煶绠�鐮�" - align="center" - prop="spell" - :show-overflow-tooltip="true" - /> - <!-- <el-table-column label="琛屾斂鍖哄垝ID" align="center" prop="areaid" /> --> - <!-- <el-table-column label="琛屾斂鍖哄垝鍚嶇О" align="center" prop="areaName" /> --> - <el-table-column - label="涓婚櫌鍖�" - align="center" - prop="mainHospArea" - :show-overflow-tooltip="true" - > + <el-table-column label="搴忓彿" align="center" prop="newID" width="50px" fixed="left" /> + <el-table-column label="闄㈠尯鍚嶇О" align="center" prop="hospAreaName" width="120px" :show-overflow-tooltip="true" + fixed="left" /> + <el-table-column label="闄㈠尯缂栫爜" align="center" prop="code" :show-overflow-tooltip="true" /> + <el-table-column label="浜旂瑪绠�鐮�" align="center" prop="wbm" :show-overflow-tooltip="true" /> + <el-table-column label="鎷奸煶绠�鐮�" align="center" prop="spell" :show-overflow-tooltip="true" /> + <el-table-column label="涓婚櫌鍖�" align="center" prop="mainHospArea" :show-overflow-tooltip="true"> <template slot-scope="scope"> - <dict-tag - :options="dict.type.sys_yes_no" - :value="scope.row.mainHospArea" - /> + <dict-tag :options="dict.type.sys_yes_no" :value="scope.row.mainHospArea" /> </template> </el-table-column> - <el-table-column - label="璐熻矗浜�" - align="center" - prop="principal" - :show-overflow-tooltip="true" - /> - <el-table-column - label="璐熻矗浜虹數璇�" - align="center" - prop="phone" - :show-overflow-tooltip="true" - width="120px" - /> - <el-table-column - label="缂栧埗搴婁綅" - align="center" - prop="plaitBed" - :show-overflow-tooltip="true" - /> - <el-table-column - label="寮�鏀惧簥浣�" - align="center" - prop="openBed" - :show-overflow-tooltip="true" - /> - <el-table-column - label="鎴愮珛鏃ユ湡" - align="center" - prop="buildDate" - width="120px" - :show-overflow-tooltip="true" - > + <el-table-column label="璐熻矗浜�" align="center" prop="principal" :show-overflow-tooltip="true" /> + <el-table-column label="璐熻矗浜虹數璇�" align="center" prop="phone" :show-overflow-tooltip="true" width="120px" /> + <el-table-column label="缂栧埗搴婁綅" align="center" prop="plaitBed" :show-overflow-tooltip="true" /> + <el-table-column label="寮�鏀惧簥浣�" align="center" prop="openBed" :show-overflow-tooltip="true" /> + <el-table-column label="鎴愮珛鏃ユ湡" align="center" prop="buildDate" width="120px" :show-overflow-tooltip="true"> <template slot-scope="scope"> <span>{{ parseTime(scope.row.buildDate, "{y}-{m}-{d}") }}</span> </template> </el-table-column> - <el-table-column - label="澶囨敞" - align="center" - prop="remark" - :show-overflow-tooltip="true" - /> - <el-table-column - label="鎺掑簭" - align="center" - prop="orderNum" - width="50px" - :show-overflow-tooltip="true" - /> - <el-table-column - label="鏁版嵁鐘舵��" - align="center" - prop="effective" - :show-overflow-tooltip="true" - > + <el-table-column label="澶囨敞" align="center" prop="remark" :show-overflow-tooltip="true" /> + <el-table-column label="鎺掑簭" align="center" prop="orderNum" width="50px" :show-overflow-tooltip="true" /> + <el-table-column label="鏁版嵁鐘舵��" align="center" prop="effective" :show-overflow-tooltip="true"> <template slot-scope="scope"> - <dict-tag - :options="dict.type.dict_data_status" - :value="scope.row.effective" - /> + <dict-tag :options="dict.type.dict_data_status" :value="scope.row.effective" /> </template> </el-table-column> - <!-- <el-table-column label="鍒涘缓浜哄鍚�" align="center" prop="createByName" /> --> - <!-- <el-table-column label="淇敼浜哄鍚�" align="center" prop="updateByName" /> --> - <!-- <el-table-column label="鍥剧墖" align="center" prop="imgbase64" width="100"> + <el-table-column fixed="right" label="鎿嶄綔" align="center" class-name="small-padding fixed-width" width="80px"> <template slot-scope="scope"> - <image-preview :src="scope.row.imgbase64" :width="50" :height="50" /> - </template> - </el-table-column> --> - <el-table-column - fixed="right" - label="鎿嶄綔" - align="center" - class-name="small-padding fixed-width" - width="80px" - > - <template slot-scope="scope"> - <el-button - size="mini" - type="text" - icon="el-icon-edit" - @click="handleUpdate(scope.row)" - v-hasPermi="['hosp:hosp:edit']" - title="淇敼" - ></el-button> - <el-button - size="mini" - type="text" - icon="el-icon-delete" - @click="handleDelete(scope.row)" - v-hasPermi="['hosp:hosp:remove']" - title="鍒犻櫎" - ></el-button> + <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" + v-hasPermi="['hosp:hosp:edit']" title="淇敼"></el-button> + <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" + v-hasPermi="['hosp:hosp:remove']" title="鍒犻櫎"></el-button> </template> </el-table-column> </el-table> <div class="pag"> <div class="pag1"> - <pagination - v-show="total > 0" - :total="total" - :page.sync="queryParams.pageNum" - :limit.sync="queryParams.pageSize" - @pagination="getList" - /> + <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" + :limit.sync="queryParams.pageSize" @pagination="getList" /> </div> </div> <!-- 娣诲姞鎴栦慨鏀归櫌鍖轰俊鎭璇濇 --> - <el-dialog - :title="title" - :visible.sync="open" - width="1000px" - append-to-body - > - <el-form - ref="form" - :model="form" - :rules="rules" - label-width="100px" - :inline="true" - > + <el-dialog :title="title" :visible.sync="open" width="1000px" append-to-body> + <el-form ref="form" :model="form" :rules="rules" label-width="100px" :inline="true"> <el-form-item label="闄㈠尯鍚嶇О" prop="hospAreaName"> <el-input v-model="form.hospAreaName" placeholder="璇疯緭鍏ラ櫌鍖哄悕绉�" /> </el-form-item> <el-form-item label="闄㈠尯缂栫爜" prop="code"> <el-input v-model="form.code" placeholder="璇疯緭鍏ラ櫌鍖虹紪鐮�" /> </el-form-item> - <el-form-item label="涓婚櫌鍖� " prop="mainHospArea"> - <el-select - v-model="form.mainHospArea" - placeholder="璇烽�夋嫨鏄惁涓婚櫌鍖� 0-涓嶆槸 1-鏄�" - style="width: 130px" - > - <el-option - v-for="dict in dict.type.sys_yes_no" - :key="dict.value" - :label="dict.label" - :value="dict.value" - ></el-option> + <el-form-item label="涓婚櫌鍖�" prop="mainHospArea"> + <el-select v-model="form.mainHospArea" placeholder="璇烽�夋嫨鏄惁涓婚櫌鍖� 0-涓嶆槸 1-鏄�" style="width: 130px"> + <el-option v-for="dict in dict.type.sys_yes_no" :key="dict.value" :label="dict.label" + :value="dict.value"></el-option> </el-select> </el-form-item> - <!-- <el-form-item label="鍖荤枟鏈烘瀯ID" prop="hospid"> - <el-input v-model="form.hospid" placeholder="璇疯緭鍏ュ尰鐤楁満鏋処D" /> - </el-form-item> --> <el-form-item label="鏈烘瀯鍚嶇О" prop="hospName"> - <el-select - v-model="form.hospid" - placeholder="璇烽�夋嫨鎵�鍦ㄦ満鏋�" - clearable - style="width: 200px" - filterable - > - <el-option - v-for="dict in orgList" - :key="dict.orgCnName" - :label="dict.orgCnName" - :value="dict.orgId" - /> + <el-select v-model="form.hospid" placeholder="璇烽�夋嫨鎵�鍦ㄦ満鏋�" clearable style="width: 200px" filterable> + <el-option v-for="dict in orgList" :key="dict.orgCnName" :label="dict.orgCnName" :value="dict.orgId" /> </el-select> </el-form-item> - <!-- <el-form-item label="浜旂瑪绠�鐮�" prop="wbm"> - <el-input v-model="form.wbm" placeholder="璇疯緭鍏ヤ簲绗旂畝鐮�" /> - </el-form-item> --> - <!-- <el-form-item label="鎷奸煶绠�鐮�" prop="spell"> - <el-input v-model="form.spell" placeholder="璇疯緭鍏ユ嫾闊崇畝鐮�" /> - </el-form-item> --> <el-form-item label="鍖哄垝鍚嶇О" prop="areaid"> - <el-select - style="width: 200px" - v-model="form.areaid" - placeholder="璇烽�夋嫨鍖哄垝鍚嶇О" - filterable - > - <el-option - v-for="dict in dict.type.dict_qhdm" - :key="dict.value" - :label="dict.label" - :value="dict.value" - /> + <el-select style="width: 200px" v-model="form.areaid" placeholder="璇烽�夋嫨鍖哄垝鍚嶇О" filterable> + <el-option v-for="dict in dict.type.dict_qhdm" :key="dict.value" :label="dict.label" :value="dict.value" /> </el-select> - <!-- <el-input v-model="form.areaid" placeholder="璇疯緭鍏ヨ鏀垮尯鍒掑悕绉�" /> --> </el-form-item> <el-form-item label="璐熻矗浜�" prop="principal"> - <el-input - v-model="form.principal" - placeholder="璇疯緭鍏ヨ礋璐d汉" - style="width: 135px" - /> + <el-input v-model="form.principal" placeholder="璇疯緭鍏ヨ礋璐d汉" style="width: 135px" /> </el-form-item> <el-form-item label="闄㈠尯鍦板潃" prop="areaName"> - <el-input - v-model="form.areaName" - placeholder="璇疯緭鍏ラ櫌鍖哄湴鍧�" - style="width: 510px" - /> + <el-input v-model="form.areaName" placeholder="璇疯緭鍏ラ櫌鍖哄湴鍧�" style="width: 510px" /> </el-form-item> <el-form-item label="璐熻矗浜虹數璇�" prop="phone"> - <el-input - v-model="form.phone" - placeholder="璇疯緭鍏ヨ礋璐d汉鐢佃瘽" - style="width: 135px" - /> + <el-input v-model="form.phone" placeholder="璇疯緭鍏ヨ礋璐d汉鐢佃瘽" style="width: 135px" /> </el-form-item> <el-form-item label="鎴愮珛鏃ユ湡" prop="buildDate"> - <el-date-picker - clearable - v-model="form.buildDate" - type="date" - value-format="yyyy-MM-dd" - placeholder="璇烽�夋嫨鎴愮珛鏃ユ湡" - style="width: 200px" - > + <el-date-picker clearable v-model="form.buildDate" type="date" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨鎴愮珛鏃ユ湡" + style="width: 200px"> </el-date-picker> </el-form-item> <el-form-item label="缂栧埗搴婁綅鏁�" prop="plaitBed"> - <el-input - v-model="form.plaitBed" - placeholder="璇疯緭鍏ョ紪鍒跺簥浣嶆暟" - style="width: 200px" - /> - <el-form-item label="鎺掑簭" prop="orderNum"> - <el-input - v-model="form.orderNum" - placeholder="璇疯緭鍏ユ帓搴�" - style="width: 145px" - /> - </el-form-item> + <el-input v-model="form.plaitBed" placeholder="璇疯緭鍏ョ紪鍒跺簥浣嶆暟" style="width: 200px" /> </el-form-item> <el-form-item label="寮�鏀惧簥浣嶆暟" prop="openBed"> - <el-input - v-model="form.openBed" - placeholder="璇疯緭鍏ュ紑鏀惧簥浣嶆暟" - style="width: 200px" - /> + <el-input v-model="form.openBed" placeholder="璇疯緭鍏ュ紑鏀惧簥浣嶆暟" style="width: 200px" /> </el-form-item> - - <!-- <el-form-item label="鏁版嵁鐘舵��(PT10.00.004)" prop="effective"> - <el-select - v-model="form.effective" - placeholder="璇烽�夋嫨鏁版嵁鐘舵��(PT10.00.004)" - > - <el-option - v-for="dict in dict.type.dict_data_status" - :key="dict.value" - :label="dict.label" - :value="dict.value" - ></el-option> - </el-select> - </el-form-item> --> - <!-- <el-form-item label="鍒涘缓浜哄鍚�" prop="createByName"> - <el-input - v-model="form.createByName" - placeholder="璇疯緭鍏ュ垱寤轰汉濮撳悕" - /> - </el-form-item> --> - <!-- <el-form-item label="淇敼浜哄鍚�" prop="updateByName"> - <el-input - v-model="form.updateByName" - placeholder="璇疯緭鍏ヤ慨鏀逛汉濮撳悕" - /> - </el-form-item> --> - <br /> + <el-form-item label="鎺掑簭" prop="orderNum"> + <el-input v-model="form.orderNum" placeholder="璇疯緭鍏ユ帓搴�" style="width: 145px" /> + </el-form-item> <el-form-item label="澶囨敞" prop="remark"> - <el-input - v-model="form.remark" - type="textarea" - placeholder="璇疯緭鍏ュ唴瀹�" - :rows="2" - label-width="400px" - style="width: 820px" - resize="none" - ></el-input> + <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�" :rows="2" style="width: 820px" resize="none"></el-input> + </el-form-item> + <el-form-item label="鍖婚櫌绠�浠�" prop="introduction"> + <editor v-model="form.introduction" :init="editorInit" :api-key="apiKey" style="width: 820px"></editor> </el-form-item> <el-form-item label="鍥剧墖"> <image-upload v-model="form.imgbase64" /> @@ -485,63 +161,66 @@ </template> <script> -import { - listHosp, - getHosp, - delHosp, - addHosp, - updateHosp, -} from "@/api/hosp/hosp"; +import { listHosp, getHosp, delHosp, addHosp, updateHosp } from "@/api/hosp/hosp"; import { listOrg } from "@/api/hosp/org"; +import Editor from '@tinymce/tinymce-vue'; export default { name: "Hosp", dicts: ["sys_yes_no", "dict_data_status", "dict_qhdm"], + components: { Editor }, data() { - /* let checkPhoneNum = (rule, value, callback) => { - console.log( value) - let patter = new RegExp(/^1\s*[3456789]\s*(\d\s*){9}$/); - if (value == "" && value == undefined && !value) { - return callback(''); - } else if(value != undefined && value != ""){ - return callback(); - }else if (!patter.test(value)) { - return callback(''); - } - }; */ let checkPhoneNum = (rule, value, callback) => { - const pattern = /^1[3-9]\d{9}$/; // 姝g‘鐨勬墜鏈哄彿姝e垯 + const pattern = /^1[3-9]\d{9}$/; if (!value) { - return callback(new Error("璇疯緭鍏ヨ礋璐d汉鐢佃瘽")); // 蹇呭~椤规牎楠� + return callback(new Error("璇疯緭鍏ヨ礋璐d汉鐢佃瘽")); } if (!pattern.test(value)) { - return callback(new Error("璇疯緭鍏ユ纭殑鎵嬫満鍙�")); // 鏍煎紡鏍¢獙 + return callback(new Error("璇疯緭鍏ユ纭殑鎵嬫満鍙�")); } - return callback(); // 鏍¢獙閫氳繃 + return callback(); }; return { - // 閬僵灞� loading: true, - // 閫変腑鏁扮粍 ids: [], - // 闈炲崟涓鐢� single: true, - // 闈炲涓鐢� multiple: true, - // 鏄剧ず鎼滅储鏉′欢 showSearch: true, - // 鎬绘潯鏁� total: 0, - // 闄㈠尯淇℃伅琛ㄦ牸鏁版嵁 hospList: [], - // 鏈烘瀯淇℃伅琛ㄦ牸鏁版嵁 orgList: [], - // 寮瑰嚭灞傛爣棰� title: "", - // 鏄惁鏄剧ず寮瑰嚭灞� open: false, - // 鏌ヨ鍙傛暟 + apiKey: '3ceaxd5ckw4te35xj38vj3p5rmmeyv0x8pq2yrr92rwdiqzp', // 鏇挎崲涓烘偍鐨� TinyMCE API 瀵嗛挜 + editorInit: { + height: 200, + menubar: false, + plugins: [ + 'advlist autolink lists link image charmap', + 'searchreplace visualblocks code fullscreen', + 'insertdatetime media table paste wordcount' + ], + toolbar: + 'undo redo | formatselect | bold italic underline | alignleft aligncenter alignright | bullist numlist | link image table | removeformat', + images_upload_handler: (blobInfo, success, failure) => { + const reader = new FileReader(); + reader.onload = () => success(reader.result); + reader.onerror = () => failure('鍥剧墖涓婁紶澶辫触'); + reader.readAsDataURL(blobInfo.blob()); + }, + content_style: 'body { font-family: Arial, sans-serif; font-size: 14px; }', + table_default_attributes: { border: 1 }, + language: 'zh_CN', + dialog_zindex: 9999, + fixed_toolbar_container: true, + inline: false, + relative_urls: false, + remove_script_host: false, + convert_urls: false, + valid_elements: '*[*]', // 鍏佽鎵�鏈� HTML 鍏冪礌鍜屽睘鎬� + extended_valid_elements: 'p,div,span,b,strong,i,em,u,strike,sup,sub,table,tr,td,th,ul,ol,li,h1,h2,h3,h4,h5,h6,br,hr,img[*],a[*]', // 鎵╁睍鍏佽鐨勫厓绱� + }, queryParams: { pageNum: 1, pageSize: 10, @@ -557,58 +236,9 @@ openBed: null, orderNum: null, }, - // 琛ㄥ崟鍙傛暟 - form: {}, - // 琛ㄥ崟鏍¢獙 - /* rules: { - hospAreaName: [ - { required: true, validator: checkPhoneNum, trigger: "blur" }, - ], - hospid: [{ required: true, validator: checkPhoneNum, trigger: "blur" }], - // hospName: [ - // { required: true, message: "鍖荤枟鏈烘瀯鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }, - // ], - code: [{ required: true, validator: checkPhoneNum, trigger: "blur" }], - mainHospArea: [ - { - required: true, - validator: checkPhoneNum, - trigger: "change", - }, - ], - createBy: [ - { required: true, validator: checkPhoneNum, trigger: "blur" }, - ], - createTime: [ - { required: true, validator: checkPhoneNum, trigger: "blur" }, - ], - // orderNum: [ - // { required: true, message: "鎺掑簭涓嶈兘涓虹┖", trigger: "blur" }, - // ], - effective: [ - { - required: true, - validator: checkPhoneNum, - trigger: "change", - }, - ], - createByName: [ - { required: true, validator: checkPhoneNum, trigger: "blur" }, - ], - updateByName: [ - { required: true, validator: checkPhoneNum, trigger: "blur" }, - ], - areaName: [ - { required: true, validator: checkPhoneNum, trigger: "blur" }, - ], - principal: [ - { required: true, validator: checkPhoneNum, trigger: "blur" }, - ], - phone: [ - { required: true, validator: checkPhoneNum, trigger: "blur" }, // 浣跨敤鎵嬫満鍙锋牎楠屽櫒 - ], - }, */ - + form: { + introduction: '<p>璇疯緭鍏ュ尰闄㈢畝浠�...</p>', // 榛樿鍊� + }, rules: { hospAreaName: [ { required: true, message: "璇疯緭鍏ラ櫌鍖哄悕绉�", trigger: "blur" }, @@ -626,6 +256,16 @@ phone: [ { required: true, validator: checkPhoneNum, trigger: "blur" }, ], + introduction: [ + { required: true, message: "璇疯緭鍏ュ尰闄㈢畝浠�", trigger: "blur" }, + { validator: (rule, value, callback) => { + if (!value || value === '<p>璇疯緭鍏ュ尰闄㈢畝浠�...</p>') { + callback(new Error("鍖婚櫌绠�浠嬩笉鑳戒负绌�")); + } else { + callback(); + } + }, trigger: "blur" } + ], }, }; }, @@ -634,7 +274,48 @@ this.getListOrg(); }, methods: { - /** 鏌ヨ闄㈠尯淇℃伅鍒楄〃 */ + // 妫�娴嬪瓧绗︿覆鏄惁涓烘湁鏁堢殑 Base64 缂栫爜 + isBase64(str) { + if (!str || typeof str !== 'string') return false; + // Base64 瀛楃涓插彧鍖呭惈 A-Z, a-z, 0-9, +, /, =锛屼笖闀垮害閫氬父涓� 4 鐨勫�嶆暟 + const base64Regex = /^[A-Za-z0-9+/=]+$/; + if (!base64Regex.test(str)) return false; + // 杩涗竴姝ラ獙璇佹槸鍚﹀彲浠ヨВ鐮� + try { + // 妫�鏌ラ暱搴︽槸鍚︿负 4 鐨勫�嶆暟锛堣�冭檻濉厖瀛楃 =锛� + if (str.length % 4 !== 0) return false; + // 灏濊瘯瑙g爜 + const decoded = atob(str); + // 楠岃瘉瑙g爜鍚庢槸鍚﹀彲浠ラ噸鏂扮紪鐮佷负鍘熷瓧绗︿覆 + return btoa(decoded) === str; + } catch (e) { + return false; + } + }, + // 瑙g爜 Base64锛屽鐞� Unicode 瀛楃 + decodeBase64(str) { + try { + // 鏇挎崲 URL-safe Base64 瀛楃锛堝鏋滃悗绔娇鐢ㄤ簡 URL-safe 缂栫爜锛� + str = str.replace(/-/g, '+').replace(/_/g, '/'); + // 浣跨敤 atob 瑙g爜 + const decoded = atob(str); + // 灏� Latin1 瀛楃涓茶浆鎹负 UTF-8 + return decodeURIComponent(escape(decoded)); + } catch (e) { + console.error("Base64 瑙g爜澶辫触:", e); + return null; + } + }, + // 缂栫爜涓� Base64锛屽鐞� Unicode 瀛楃 + encodeBase64(str) { + try { + // 灏� UTF-8 瀛楃涓茶浆鎹负 Latin1 缂栫爜 + return btoa(unescape(encodeURIComponent(str))); + } catch (e) { + console.error("Base64 缂栫爜澶辫触:", e); + return null; + } + }, getList() { this.loading = true; listHosp(this.queryParams).then((response) => { @@ -649,18 +330,15 @@ this.loading = false; }); }, - /** 鏌ヨ鏈烘瀯淇℃伅鍒楄〃 */ getListOrg() { listOrg(this.queryParams).then((response) => { this.orgList = response.rows; }); }, - // 鍙栨秷鎸夐挳 cancel() { this.open = false; this.reset(); }, - // 琛ㄥ崟閲嶇疆 reset() { this.form = { hospAreaId: null, @@ -689,53 +367,77 @@ updateByName: null, imgbase64: null, deleted: null, + introduction: '<p>璇疯緭鍏ュ尰闄㈢畝浠�...</p>', // 閲嶇疆鏃舵仮澶嶉粯璁ゅ�� }; this.resetForm("form"); }, - /** 鎼滅储鎸夐挳鎿嶄綔 */ handleQuery() { this.queryParams.pageNum = 1; this.getList(); }, - /** 閲嶇疆鎸夐挳鎿嶄綔 */ resetQuery() { this.resetForm("queryForm"); this.handleQuery(); }, - // 澶氶�夋閫変腑鏁版嵁 handleSelectionChange(selection) { this.ids = selection.map((item) => item.hospAreaId); this.single = selection.length !== 1; this.multiple = !selection.length; }, - /** 鏂板鎸夐挳鎿嶄綔 */ handleAdd() { this.reset(); this.open = true; this.title = "鍒嗛櫌淇℃伅缁存姢"; }, - /** 淇敼鎸夐挳鎿嶄綔 */ handleUpdate(row) { this.reset(); const hospAreaId = row.hospAreaId || this.ids; getHosp(hospAreaId).then((response) => { this.form = response.data; + console.log("鍘熷 introduction:", response.data.introduction); // 璋冭瘯杈撳嚭 + if (this.form.introduction) { + // 妫�娴嬫槸鍚︿负 Base64 缂栫爜 + if (this.isBase64(this.form.introduction)) { + const decoded = this.decodeBase64(this.form.introduction); + if (decoded) { + this.form.introduction = decoded; + console.log("瑙g爜鍚庣殑 introduction:", this.form.introduction); // 璋冭瘯杈撳嚭 + } else { + this.form.introduction = '<p>鏃犳硶瑙g爜鍖婚櫌绠�浠嬶紝璇锋鏌ユ暟鎹�</p>'; + } + } else { + // 濡傛灉涓嶆槸 Base64锛屽亣璁炬槸 HTML 鎴栫函鏂囨湰锛岀洿鎺ヤ娇鐢� + this.form.introduction = this.form.introduction; + } + } else { + this.form.introduction = '<p>璇疯緭鍏ュ尰闄㈢畝浠�...</p>'; + } this.open = true; this.title = "鍒嗛櫌淇℃伅缁存姢"; }); }, - /** 鎻愪氦鎸夐挳 */ submitForm() { this.$refs["form"].validate((valid) => { if (valid) { - if (this.form.hospAreaId != null) { - updateHosp(this.form).then((response) => { + const formData = { ...this.form }; + // 濡傛灉鍚庣瑕佹眰 Base64 缂栫爜 + if (formData.introduction) { + const encoded = this.encodeBase64(formData.introduction); + if (encoded) { + formData.introduction = encoded; + } else { + this.$modal.msgError("鍖婚櫌绠�浠嬬紪鐮佸け璐ワ紝璇锋鏌ュ唴瀹�"); + return; + } + } + if (formData.hospAreaId != null) { + updateHosp(formData).then((response) => { this.$modal.msgSuccess("淇敼鎴愬姛"); this.open = false; this.getList(); }); } else { - addHosp(this.form).then((response) => { + addHosp(formData).then((response) => { this.$modal.msgSuccess("鏂板鎴愬姛"); this.open = false; this.getList(); @@ -744,7 +446,6 @@ } }); }, - /** 鍒犻櫎鎸夐挳鎿嶄綔 */ handleDelete(row) { const hospAreaIds = row.hospAreaId || this.ids; this.$modal @@ -758,26 +459,66 @@ }) .catch(() => {}); }, - /** 瀵煎嚭鎸夐挳鎿嶄綔 */ handleExport() { this.download( "hosp/hosp/export", { ...this.queryParams, }, - `hosp_${new Date().getList()}.xlsx` + `hosp_${new Date().getTime()}.xlsx` ); }, }, }; </script> -<style scoped> + +<style lang="scss"> .pag { width: 100%; display: flex; justify-content: center; } + .pag1 { width: 30%; } -</style> + +.app-container { + padding: 20px; +} + +.el-form-item { + margin-bottom: 10px; +} + +/* 璋冩暣 TinyMCE 缂栬緫鍣ㄦ牱寮� */ +.tox-tinymce { + border: 1px solid #dcdfe6; + border-radius: 4px; +} + +/* 鎻愰珮 TinyMCE 瀛愬璇濇鐨� z-index */ +.tox-dialog-wrap { + z-index: 9999 !important; /* 纭繚楂樹簬 el-dialog 鐨勯粯璁� z-index */ +} + +/* 鎻愰珮 TinyMCE 涓嬫媺鑿滃崟鐨� z-index */ +.tox-menu { + z-index: 9999 !important; +} + +/* 鎻愰珮 TinyMCE 宸ュ叿鏍忕殑 z-index */ +.tox-toolbar { + z-index: 9999 !important; +} + +/* 鎻愰珮 TinyMCE 鐘舵�佹爮鐨� z-index */ +.tox-statusbar { + z-index: 9999 !important; +} + +/* 纭繚鎵�鏈� TinyMCE 鐩稿叧鍏冪礌閮芥湁瓒冲楂樼殑 z-index */ +.tox-tinymce-aux { + z-index: 9999 !important; +} +</style> \ No newline at end of file -- Gitblit v1.8.0