From a398c62a2ac6ef819f162dc3e0923bed144905dc Mon Sep 17 00:00:00 2001 From: WXL <1785969728@qq.com> Date: 星期五, 27 六月 2025 09:17:11 +0800 Subject: [PATCH] 测试完成 --- src/views/patient/follow/index.vue | 710 ++++++++++++++++++++++++++++++++++------------------------ 1 files changed, 418 insertions(+), 292 deletions(-) diff --git a/src/views/patient/follow/index.vue b/src/views/patient/follow/index.vue index c133603..9ddcbc4 100644 --- a/src/views/patient/follow/index.vue +++ b/src/views/patient/follow/index.vue @@ -21,131 +21,73 @@ /> </el-form-item> - <el-form-item label="鎮h�呰寖鍥�" prop="tagId"> + <!-- <el-form-item label="鎮h�呰寖鍥�" prop="tagId"> <el-select - v-model="queryParams.Patientid" - multiple + v-model="queryParams.searchscope" placeholder="璇烽�夋嫨" > <el-option v-for="item in Patientrange" - :key="item.id" - :label="item.name" - :value="item.id" + :key="item.value" + :label="item.label" + :value="item.value" > </el-option> </el-select> - </el-form-item> - <el-form-item label="鏄惁浼氬憳" prop="tagId"> - <el-select - v-model="queryParams.whether" - multiple - placeholder="璇烽�夋嫨" - > - <el-option - v-for="item in whether" - :key="item.id" - :label="item.name" - :value="item.id" - > - </el-option> - </el-select> - </el-form-item> - <el-form-item label="杩囨护鏃堕棿" prop="tagId"> - <el-date-picker - v-model="queryParams.value1" - type="daterange" - range-separator="鑷�" - start-placeholder="寮�濮嬫棩鏈�" - end-placeholder="缁撴潫鏃ユ湡" - > - </el-date-picker> - </el-form-item> - <el-row> - <el-form-item label="杩囨护绫诲瀷" prop="tagId"> - <el-select - v-model="queryParams.tagIds" - multiple - placeholder="璇烽�夋嫨" - > - <el-option - v-for="item in Filterreason" - :key="item.id" - :label="item.name" - :value="item.id" - > - </el-option> - </el-select> - </el-form-item> + </el-form-item> --> + + <el-row :gutter="15"> <el-form-item> - <el-button - type="primary" - icon="el-icon-search" - size="medium" - @click="handleQuery" - >鎼滅储</el-button - > - <el-button - icon="el-icon-refresh" - size="medium" - @click="resetQuery" - >閲嶇疆</el-button - > + <el-col :span="1.5"> + <el-button + type="primary" + icon="el-icon-search" + size="medium" + @click="handleQuery" + >鎼滅储</el-button + > + </el-col> + <el-col :span="1.5"> + <el-button + icon="el-icon-refresh" + size="medium" + @click="resetQuery" + >閲嶇疆</el-button + > + </el-col> + <el-col :span="1.5"> + <el-button + type="primary" + plain + icon="el-icon-help" + size="medium" + @click="distribute" + >鏂板鎮h�呰繃婊�</el-button + > + </el-col> </el-form-item> </el-row> </el-form> - <el-row :gutter="10" class="mb8"> - <el-col :span="1.5"> - <el-button - type="primary" - plain - icon="el-icon-plus" - size="medium" - @click="handleAdd" - v-hasPermi="['system:user:add']" - >鏂板</el-button - > - </el-col> - <el-col :span="1.5"> - <el-button - type="success" - plain - icon="el-icon-edit" - size="medium" - :disabled="single" - @click="handleUpdate" - v-hasPermi="['system:user:edit']" - >淇敼</el-button - > - </el-col> - <el-col :span="1.5"> - <el-button - type="danger" - plain - icon="el-icon-delete" - size="medium" - :disabled="multiple" - @click="handleDelete" - v-hasPermi="['system:user:remove']" - >鍒犻櫎</el-button - > - </el-col> - <!-- <el-col :span="1.5"> </el-col> --> - </el-row> <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange" > <el-table-column type="selection" width="50" align="center" /> - <el-table-column + <!-- <el-table-column label="搴忓彿" align="center" - key="patid" - prop="patid" + key="id" + prop="id" + /> --> + <el-table-column + fixed + label="濮撳悕" + align="center" + key="name" + prop="name" /> - <el-table-column label="濮撳悕" align="center" key="name" prop="name" /> <el-table-column label="鎬у埆" align="center" key="sex" prop="sex"> <template slot-scope="scope"> <span>{{ scope.row.sex == 1 ? "鐢�" : "濂�" }}</span> @@ -156,25 +98,48 @@ align="center" key="age" prop="age" - width="120" + width="60" /> - <el-table-column - label="璇佷欢缂栧彿" + label="鍑虹敓骞存湀" align="center" - key="age" - prop="age" - width="120" - /> - <el-table-column + key="birthdate" + prop="birthdate" + width="160" + > + </el-table-column> + + <!-- <el-table-column label="杩囨护绫诲瀷" align="center" - key="age" - prop="age" + key="notrequiredreason" + prop="notrequiredreason" width="120" - /> + > + <template slot-scope="scope"> + <dict-tag + :options="dict.type.futter_patient" + :value="scope.row.notrequiredreason" + /> + </template> + </el-table-column> --> <el-table-column label="杩囨护鍘熷洜" + align="center" + key="notrequiredreason" + prop="notrequiredreason" + width="190" + /> + <el-table-column + label="灞呬綇鍦�" + align="center" + key="placeOfResidence" + prop="placeOfResidence" + width="180" + :show-overflow-tooltip="true" + /> + <el-table-column + label="鎮h�呮爣绛�" align="center" key="tagList" prop="tagList" @@ -182,22 +147,17 @@ :show-overflow-tooltip="true" > <template slot-scope="scope"> - <span v-for="item in scope.row.tagList">{{ item }} </span> + <span v-for="item in scope.row.tagList">{{ item.tagname }} </span> </template> </el-table-column> <el-table-column - label="璇佷欢绫诲瀷" - align="center" - key="idcardtype" - prop="idcardtype" - width="120" - /><el-table-column - label="璇佷欢缂栧彿" + label="璇佷欢鍙风爜" align="center" key="idcardno" prop="idcardno" width="190" /> + <el-table-column label="鑱旂郴鏂瑰紡" align="center" @@ -206,26 +166,21 @@ width="120" /> <el-table-column - label="瀹跺涵浣忓潃" + label="寤烘。鏃ユ湡" align="center" - key="idcardno" - prop="idcardno" - width="190" - /> - <el-table-column - label="鎿嶄綔鏃ユ湡" - align="center" - key="archivetime" - prop="archivetime" + key="createTime" + prop="createTime" width="160" > <template slot-scope="scope"> - <span>{{ parseTime(scope.row.createTime) }}</span> + <span>{{ formatTime(scope.row.createTime) }}</span> </template> </el-table-column> + <el-table-column label="鎿嶄綔" align="center" + fixed="right" width="190" class-name="small-padding fixed-width" > @@ -236,10 +191,9 @@ @click=" $router.push({ path: '/patient/patient/profile/', - query: { id: scope.row.patid }, + query: { id: scope.row.id }, }) " - v-hasPermi="['system:user:edit']" ><span class="button-textsc" ><i class="el-icon-zoom-in"></i>鏌ョ湅</span ></el-button @@ -247,8 +201,7 @@ <el-button size="medium" type="text" - @click="handleUpdate(scope.row)" - v-hasPermi="['system:user:edit']" + @click="handleDelete(scope.row)" ><span class="button-textxga" ><i class="el-icon-edit"></i>鍙栨秷杩囨护</span ></el-button @@ -266,16 +219,195 @@ /> </el-col> </el-row> + <el-dialog title="閫夋嫨鎮h��" :visible.sync="distributeVisible" width="70%"> + <el-row :gutter="20"> + <!--鐢ㄦ埛鏁版嵁--> + <el-col :span="24" :xs="24"> + <el-form + :model="filtrqueryParams" + ref="queryForm" + size="small" + :inline="true" + label-width="98px" + > + <el-form-item label="鎮h�呭鍚�" prop="name"> + <el-input + v-model="filtrqueryParams.name" + placeholder="璇疯緭鍏ュ鍚�" + maxlength="30" + @keyup.enter.native="handleQuery" + /> + </el-form-item> + <el-form-item label="鎮h�呮爣绛�" prop="tagname"> + <el-input + v-model="filtrqueryParams.tagname" + placeholder="杈撳叆杩涜妯$硦鏌ヨ" + maxlength="30" + @keyup.enter.native="handleQuery" + /> + </el-form-item> + <!-- <el-form-item label="鎮h�呰寖鍥�" prop="tagId"> + <el-select + v-model="filtrqueryParams.searchscope" + placeholder="璇烽�夋嫨鎮h�呰寖鍥�" + > + <el-option + v-for="item in source" + :key="item.value" + :label="item.label" + :value="item.value" + > + </el-option> + </el-select> + </el-form-item> --> - <!-- 娣诲姞鎴栦慨鏀圭敤鎴烽厤缃璇濇 --> - <el-dialog - :title="amendtag ? '淇敼鎮h�呬俊鎭�' : '鏂板鎮h��'" - :visible.sync="Labelchange" - width="900px" - > + <el-form-item> + <el-button + type="primary" + icon="el-icon-search" + size="medium" + @click="distribute" + >鎼滅储</el-button + > + </el-form-item> + </el-form> + <el-table v-loading="filtrloading" :data="filtruserList" height="660"> + <el-table-column type="selection" width="50" align="center" /> + <el-table-column + fixed + label="濮撳悕" + align="center" + key="name" + prop="name" + /> + <el-table-column + label="鎮h�呯紪鍙�" + align="center" + key="patientno" + prop="patientno" + width="180" + /> + + <el-table-column label="鎬у埆" align="center" key="sex" prop="sex"> + <template slot-scope="scope"> + <span>{{ scope.row.sex == 1 ? "鐢�" : "濂�" }}</span> + </template> + </el-table-column> + <el-table-column + label="骞撮緞" + align="center" + key="age" + prop="age" + width="160" + > + <template slot-scope="scope"> + <span v-if="scope.row.age" + >{{ scope.row.age }}{{ scope.row.ageUnit }}</span + ><span v-if="scope.row.age2" + >{{ scope.row.age2 }}{{ scope.row.ageUnit2 }}</span + > + </template> + </el-table-column> + <el-table-column + label="鍑虹敓骞存湀" + align="center" + key="birthdate" + prop="birthdate" + width="120" + > + </el-table-column> + <el-table-column + label="灞呬綇鍦�" + align="center" + key="placeOfResidence" + prop="placeOfResidence" + width="150" + :show-overflow-tooltip="true" + /> + <el-table-column + label="鎮h�呮爣绛�" + align="center" + key="tagList" + prop="tagList" + width="160" + :show-overflow-tooltip="true" + > + <template slot-scope="scope"> + <span v-for="item in scope.row.tagList" + >{{ item.tagname }} + </span> + </template> + </el-table-column> + <el-table-column + label="璇佷欢鍙风爜" + align="center" + key="idcardno" + prop="idcardno" + width="190" + /> + + <el-table-column + label="鑱旂郴鏂瑰紡" + align="center" + key="telcode" + prop="telcode" + width="120" + /> + <el-table-column + label="寤烘。鏃ユ湡" + align="center" + key="createTime" + prop="createTime" + width="160" + > + <template slot-scope="scope"> + <span>{{ formatTime(scope.row.createTime) }}</span> + </template> + </el-table-column> + <el-table-column + label="鏇存柊鏃ユ湡" + align="center" + prop="archivetime" + width="160" + > + <template slot-scope="scope"> + <span>{{ formatTime(scope.row.archivetime) }}</span> + </template> + </el-table-column> + <el-table-column + fixed="right" + label="鎿嶄綔" + align="center" + width="190" + class-name="small-padding fixed-width" + > + <template slot-scope="scope"> + <el-button + size="medium" + type="text" + @click="handleUpdate(scope.row)" + ><span class="button-textxga" + ><i class="el-icon-help"></i>鎮h�呰繃婊�</span + ></el-button + > + </template> + </el-table-column> + </el-table> + + <pagination + v-show="total > 0" + :total="total" + :page.sync="filtrqueryParams.pageNum" + :limit.sync="filtrqueryParams.pageSize" + @pagination="getList" + /> + </el-col> + </el-row> + </el-dialog> + <el-dialog title="淇敼鎮h�呬俊鎭�" :visible.sync="Labelchange" width="900px"> <el-form ref="form" :model="form" :rules="rules" label-width="100px"> <el-row> - <el-col :span="12"> + <el-col :span="8"> <el-form-item label="濮撳悕" prop="name"> <el-input v-model="form.name" @@ -284,11 +416,11 @@ /> </el-form-item> </el-col> - <el-col :span="12"> + <el-col :span="8"> <el-form-item label="鎬у埆" prop="sex"> <el-select v-model="form.sex" placeholder="璇烽�夋嫨鎬у埆"> <el-option - v-for="dict in dict.type.sys_user_sex" + v-for="dict in sextype" :key="dict.value" :label="dict.label" :value="dict.value" @@ -296,54 +428,7 @@ </el-select> </el-form-item> </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="璇佷欢绫诲瀷" prop="idcardtype"> - <el-select v-model="form.idcardtype" placeholder="璇烽�夋嫨鎬у埆"> - <el-option - v-for="item in paperstypes" - :key="item.papersname" - :label="item.papersname" - :value="item.papersname" - ></el-option> - </el-select> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="璇佷欢鍙�" prop="idcardno"> - <el-input - v-model="form.idcardno" - placeholder="璇疯緭鍏ヨ瘉浠跺彿" - maxlength="50" - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="鏈汉鎵嬫満鍙�" prop="telcode"> - <el-input - v-model="form.telcode" - placeholder="璇疯緭鍏ユ墜鏈哄彿" - maxlength="30" - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="浜插睘鎵嬫満鍙�" prop="relativetelcode"> - <el-input - v-model="form.relativetelcode" - placeholder="璇疯緭鍏ヤ翰灞炴墜鏈哄彿" - type="password" - maxlength="20" - show-password - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> + <el-col :span="8"> <el-form-item label="骞撮緞" prop="age"> <el-input v-model="form.age" @@ -352,29 +437,15 @@ /> </el-form-item> </el-col> - <el-col :span="12"> - <el-form-item label="鎮h�呮爣绛�"> - <!-- <el-select v-model="form.sex" placeholder="璇烽�夋嫨"> --> - <el-select v-model="form.tagList" multiple placeholder="璇烽�夋嫨"> - <el-option - v-for="item in optionstag" - :key="item.tagid" - :label="item.tagname" - :value="item.tagid" - > - </el-option> - </el-select> - <!-- </el-select> --> - </el-form-item> - </el-col> </el-row> + <el-row> <el-col :span="24"> - <el-form-item label="澶囨敞"> + <el-form-item label="杩囨护鍘熷洜"> <el-input - v-model="form.remark" + v-model="form.notrequiredreason" type="textarea" - placeholder="璇疯緭鍏ュ唴瀹�" + placeholder="璇疯緭鍏ヨ繃婊ゅ師鍥�" ></el-input> </el-form-item> </el-col> @@ -390,35 +461,31 @@ <script> import { delUser } from "@/api/system/user"; -import { - listpat_archive, - getpat_archive, - addpat_archive, - updatepat_archive, - delpat_archive, -} from "@/api/smartorpor/pat_archive"; + import { messagelistpatient, alterpatient, - addpatient, + addfiltration, particularpatient, - deletepatient, + delfiltration, Exporterrorpatient, toleadpatient, } from "@/api/patient/homepage"; import { listtag } from "@/api/system/label"; import { getToken } from "@/utils/auth"; import Treeselect from "@riophae/vue-treeselect"; +import store from "@/store"; import "@riophae/vue-treeselect/dist/vue-treeselect.css"; export default { name: "Userhuanze", - dicts: ["sys_normal_disable", "sys_user_sex"], + dicts: ["sys_normal_disable", "sys_user_sex", "futter_patient"], components: { Treeselect }, data() { return { // 閬僵灞� loading: true, + filtrloading: true, // 閫変腑鏁扮粍 ids: [], // 闈炲崟涓鐢� @@ -429,8 +496,12 @@ showSearch: true, // 鎬绘潯鏁� total: 0, + filtrtotal: 0, // 鐢ㄦ埛琛ㄦ牸鏁版嵁 userList: null, + filtruserList: null, + distributeVisible: false, + // 寮瑰嚭灞傛爣棰� title: "", // 閮ㄩ棬鏍戦�夐」 @@ -461,6 +532,11 @@ idcardtype: "", relativetelcode: "", }, + filtrqueryParams: { + notrequiredFlag: 0, + pageNum: 1, + pageSize: 10, + }, //瀵煎叆杩涘害 dractive: 1, // 瀵煎叆灞曠ず琛ㄥ崟 @@ -470,18 +546,28 @@ Labelchange: false, //淇敼鏂板寮圭獥 propss: { multiple: true }, optionstag: [], //鏍囩鍒楄〃 + sextype: [ + { + value: 1, + label: "鐢�", + }, + { + value: 2, + label: "濂�", + }, + ], Patientrange: [ { - name: "闂ㄨ瘖", - id: 1, + value: 0, + label: "鎵�灞炴偅鑰�", }, { - name: "浣忛櫌", - id: 2, + value: 1, + label: "绉戝鎮h��", }, { - name: "浣撴", - id: 3, + value: 2, + label: "鐥呭尯鎮h��", }, ], whether: [ @@ -494,28 +580,7 @@ id: 2, }, ], - Filterreason: [ - { - name: "鎮h�呮浜�", - id: 1, - }, - { - name: "棰戠箒灏辫瘖", - id: 2, - }, - { - name: "鎮h�呮嫆缁濇湇鍔�", - id: 3, - }, - { - name: "鑱旂郴鏂瑰紡鏃犳晥", - id: 4, - }, - { - name: "榛戝悕鍗�", - id: 5, - }, - ], + Filterreason: [], defaultProps: { children: "children", label: "label", @@ -539,14 +604,64 @@ queryParams: { pageNum: 1, pageSize: 10, + allhosp: "1", + notrequiredFlag: 1, idcardno: undefined, name: undefined, status: undefined, tagIds: undefined, telcode: undefined, }, + form: { + name: "", + age: "", + sex: "", + tagList: [], + idcardno: "", + telcode: "", + idcardtype: "", + relativetelcode: "", + }, // 琛ㄥ崟鏍¢獙 - rules: {}, + rules: { + name: [ + { required: true, message: "鐢ㄦ埛鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }, + { + min: 2, + max: 20, + message: "鐢ㄦ埛鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿", + trigger: "blur", + }, + ], + + sex: [{ required: true, message: "鎬у埆涓嶈兘涓虹┖", trigger: "blur" }], + age: [{ required: true, message: "骞撮緞涓嶈兘涓虹┖", trigger: "blur" }], + nation: [{ required: true, message: "姘戞棌涓嶈兘涓虹┖", trigger: "blur" }], + telcode: [ + { required: true, message: "鑱旂郴鏂瑰紡涓嶈兘涓虹┖", trigger: "blur" }, + { + pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, + message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜", + trigger: "blur", + }, + ], + + idcardno: [ + { required: true, message: "璇佷欢鍙峰彲鑳戒负绌�", trigger: "blur" }, + { + pattern: + /^\d{6}((((((19|20)\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(((19|20)\d{2})(0[13578]|1[02])31)|((19|20)\d{2})02(0[1-9]|1\d|2[0-8])|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))0229))\d{3})|((((\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|((\d{2})(0[13578]|1[02])31)|((\d{2})02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[048])0229))\d{2}))(\d|X|x)$/, + message: "璇疯緭鍏ユ纭殑韬唤璇佸彿鐮�", + trigger: "blur", + }, + ], + placeOfResidence: [ + { required: true, message: "灞呬綇鍦颁笉鑳戒负绌�", trigger: "blur" }, + ], + birthplace: [ + { required: true, message: "鍑虹敓鍦颁笉鑳戒负绌�", trigger: "blur" }, + ], + }, }; }, watch: { @@ -558,6 +673,7 @@ created() { this.getList(); this.gettabList(); + this.Filterreason = store.getters.Filterreason; }, methods: { /** 鏌ヨ鎮h�呭垪琛� */ @@ -569,6 +685,26 @@ this.total = response.total; this.loading = false; }); + }, + // 璋冭捣鏂板杩囨护寮规 + distribute() { + this.distributeVisible = true; + this.filtrloading = true; + + messagelistpatient(this.filtrqueryParams).then((response) => { + this.filtruserList = response.rows; + this.filtrtotal = response.total; + this.filtrloading = false; + }); + }, + /** 淇敼鎸夐挳鎿嶄綔 */ + handleUpdate(row) { + const userIds = row.id; + particularpatient(userIds).then((response) => { + this.form = response.data; + }); + this.amendtag = true; + this.Labelchange = true; }, /** 鏌ヨ鏍囩鍒楄〃 */ gettabList() { @@ -636,6 +772,7 @@ this.$refs.tree.setCurrentKey(null); this.handleQuery(); }, + // 澶氶�夋閫変腑鏁版嵁 handleSelectionChange(selection) { this.ids = selection.map((item) => item.patid); @@ -649,56 +786,45 @@ this.Labelchange = true; this.amendtag = false; }, - /** 淇敼鎸夐挳鎿嶄綔 */ - handleUpdate(row) { - console.log(row); - const userIds = row.patid || this.ids; - particularpatient(userIds).then((response) => { - console.log(response); - this.form = response.data; - }); - this.amendtag = true; - this.Labelchange = true; - }, //淇敼/鏂板鎮h�� submitForm() { - if (this.amendtag) { - alterpatient(this.form) - .then((response) => { - console.log(response); - }) - .then(() => { - this.getList(); - this.$modal.msgSuccess("淇敼鎴愬姛"); - }); - } else { - addpatient(this.form) - .then((response) => { - console.log(response); - }) - .then(() => { - this.getList(); - this.$modal.msgSuccess("娣诲姞鎴愬姛"); - }); - } - this.reset(); - // this.idds = ""; - this.Labelchange = false; + this.$refs["form"].validate((valid) => { + if (valid) { + this.form.isoperation = 2; + this.form.notrequiredFlag = 1; + alterpatient(this.form) + .then((response) => { + console.log(response); + }) + .then(() => { + this.getList(); + this.$modal.msgSuccess("鎮h�呰繃婊ゆ垚鍔�"); + }); + this.reset(); + // this.idds = ""; + this.Labelchange = false; + } + }); }, /** 鍒犻櫎鎸夐挳鎿嶄綔 */ handleDelete(row) { - const userIds = row.userId || this.ids; + const userIds = row.id || this.ids; this.$modal - .confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」锛�') - .then(function () { - return deletepatient(userIds); - }) + .confirm('鏄惁纭鍙栨秷鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」杩囨护锛�') .then(() => { - this.getList(); - this.$modal.msgSuccess("鍒犻櫎鎴愬姛"); + row.notrequiredFlag = 0; + alterpatient(row) + .then((response) => { + console.log(response); + }) + .then(() => { + this.getList(); + this.$modal.msgSuccess("淇敼鎴愬姛"); + }); }) + .catch(() => {}); }, /** 瀵煎嚭鎸夐挳鎿嶄綔 */ @@ -719,7 +845,7 @@ /** 涓嬭浇妯℃澘鎿嶄綔 */ importTemplate() { this.download( - "system/user/importTemplate", + "smartor/import/getImportPatTemplate", {}, `user_template_${new Date().getTime()}.xlsx` ); -- Gitblit v1.9.3