edit.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. <template>
  2. <a-modal
  3. :width="1200"
  4. v-model:visible="visible"
  5. :title="title"
  6. :confirm-loading="confirmLoading"
  7. @ok="handleOk"
  8. ok-text="提交"
  9. @cancel="handleCancel"
  10. cancel-text="取消"
  11. :keyboard="false"
  12. :mask-closable="false" >
  13. <a-form autocomplete="off" >
  14. <a-divider orientation="left">基础信息管理</a-divider>
  15. <a-row type="flex">
  16. <a-col :span="7">
  17. <a-form-item label="驿站编号" name="SiteCode" :label-col="{span:7}" :rules="[{ required: true, message: '请输入驿站编号!' }]">
  18. <label v-if="opCategory==3">{{dataModel.siteCode}}</label>
  19. <a-input v-model:value="dataModel.siteCode" placeholder=""/>
  20. </a-form-item>
  21. </a-col>
  22. <a-col :span="8">
  23. <a-form-item label="站点名称" name="SiteName" :label-col="{span:6}" :rules="[{ required: true, message: '请输入站点名称!' }]">
  24. <label v-if="opCategory==3">{{dataModel.siteName }}</label>
  25. <a-input v-model:value="dataModel.siteName" placeholder=""/>
  26. </a-form-item>
  27. </a-col>
  28. <a-col :span="8">
  29. <a-form-item label="所属机构" name="InstitutionName" :label-col="{span:6}" :rules="[{ required: true, message: '请选择所属机构!' }]">
  30. <label v-if="opCategory==3">{{dataModel.institutionName}}</label>
  31. <a-select ref="select" v-model:value="dataModel.institutionID" :options="institutionList"
  32. :field-names="{ label: 'text', value: 'value' }" :allow-clear="true" > </a-select>
  33. </a-form-item>
  34. </a-col>
  35. </a-row>
  36. <a-row type="flex">
  37. <a-col :span="7">
  38. <a-form-item label="所属县区" name="RegionCode" :label-col="{span:7}" :rules="[{ required: true, message: '请选择所属县区!' }]">
  39. <label v-if="opCategory==3">{{dataModel.regionCode}}</label>
  40. <a-select ref="select" v-model:value="dataModel.regionCode" :options="regionList"
  41. :field-names="{ label: 'name', value: 'code' }" :allow-clear="true" @change="getStreetList()" > </a-select>
  42. </a-form-item>
  43. </a-col>
  44. <a-col :span="8">
  45. <a-form-item label="所属街道" name="StreetCode" :label-col="{span:6}" :rules="[{ required: true, message: '请选择所属街道!' }]">
  46. <label v-if="opCategory==3">{{dataModel.streetCode }}</label>
  47. <a-select ref="select" v-model:value="dataModel.streetCode" :options="streetList"
  48. :field-names="{ label: 'name', value: 'code' }" :allow-clear="true" > </a-select>
  49. </a-form-item>
  50. </a-col>
  51. <a-col :span="8">
  52. <a-form-item label="详细地址" name="DetailAddress" :label-col="{span:6}" :rules="[{ required: true, message: '请输入详细地址!' }]">
  53. <label v-if="opCategory==3">{{dataModel.detailAddress }}</label>
  54. <a-input v-model:value="dataModel.detailAddress" placeholder=""/>
  55. </a-form-item>
  56. </a-col>
  57. </a-row>
  58. <a-row type="flex">
  59. <a-col :span="7">
  60. <a-form-item label="站点负责人" name="FzrName" :label-col="{span:7}" :rules="[{ required: true, message: '请输入站点负责人!' }]">
  61. <label v-if="opCategory==3">{{dataModel.fzrName }}</label>
  62. <a-input v-model:value="dataModel.fzrName" placeholder=""/>
  63. </a-form-item>
  64. </a-col>
  65. <a-col :span="8">
  66. <a-form-item label="联系电话" name="FzrMobile" :label-col="{span:6}" :rules="[{ required: true, message: '请输入联系电话!' }]">
  67. <label v-if="opCategory==3">{{dataModel.fzrMobile }}</label>
  68. <a-input v-model:value="dataModel.fzrMobile" placeholder=""/>
  69. </a-form-item>
  70. </a-col>
  71. <a-col :span="7">
  72. <a-form-item label="驿站坐标" name="SitePosition" :label-col="{span:7}" :rules="[{ required: true, message: '请选择驿站坐标!' }]">
  73. <label v-if="opCategory==3">{{dataModel.sitePosition}}</label>
  74. <a-input v-model:value="dataModel.sitePosition" placeholder=""/>
  75. </a-form-item>
  76. </a-col>
  77. <a-col :span="1">
  78. <a-button type="primary" @click='' >选择</a-button>
  79. </a-col>
  80. </a-row>
  81. <a-divider orientation="left">管理人员 共计:{{manageUsers.length}}</a-divider>
  82. <a-row>
  83. <a-col :span="24" style="text-align: right; margin-top: 20px; margin-right: 20px">
  84. <Space>
  85. <a-button @click="addSiteUser">
  86. <template #icon>
  87. <plus-circle-outlined/>
  88. </template>
  89. 新增
  90. </a-button>
  91. </Space>
  92. </a-col>
  93. </a-row>
  94. <a-row>
  95. <a-col style="margin-bottom: 20px;">
  96. <a-table :columns="columns" :data-source="manageUsers" :pagination="pagination"
  97. :loading="formState.loading"
  98. @change="handleTableChange"
  99. :row-selection="{ selectedRowKeys: formState.selectedRowKeys, onChange: onSelectChange}"
  100. :row-key="record=>record.siteId"
  101. bordered>
  102. <template #bodyCell="{ column ,index}">
  103. <template v-if="column.key === 'name'">
  104. <div>
  105. <a-select
  106. ref="select"
  107. v-model:value="manageUsers[index][column.key]"
  108. :options="allUsers"
  109. @change="manageUsersChange(index,manageUsers[index][column.key])"
  110. :field-names="{ label: 'name', value: 'siteUserID' }" style="width: 200px" >
  111. </a-select>
  112. </div>
  113. </template>
  114. <template v-if="column.key === 'genderName'">
  115. {{manageUsers[index][column.key]}}
  116. </template>
  117. <template v-if="column.key === 'roleName'">
  118. {{manageUsers[index][column.key]}}
  119. </template>
  120. <template v-if="column.key === 'operation'">
  121. <a-button type="link" size="small" @click="delSiteUser(index)">删除</a-button>
  122. </template>
  123. </template>
  124. </a-table>
  125. </a-col>
  126. </a-row>
  127. <a-divider orientation="left">其他信息</a-divider>
  128. <a-row>
  129. <a-textarea :auto-size="{ minRows: 4, maxRows: 10 }" v-model:value="dataModel.remark" :disabled="opCategory==3"
  130. placeholder="备注" style="text-align: center;" />
  131. </a-row>
  132. </a-form>
  133. </a-modal>
  134. </template>
  135. <script lang="ts">
  136. import {computed, defineComponent, reactive, ref, toRefs} from "vue";
  137. import {getSiteByID, saveSite} from "@/api/baseSettings/siteInfo";
  138. import BUploadFile from "@/components/file/uploadFile.vue";
  139. import {message, SelectProps, TableColumnsType, TableProps} from "ant-design-vue";
  140. import {getRegionCodeList, getStreetCodeList} from "@/api/system/area/index";
  141. import {getSiteUserList,getSiteUserDataList,getListBySiteID, getSiteUserByID} from "@/api/baseSettings/userInfo";
  142. import {getInstitutionDataList} from "@/api/baseSettings/institution";
  143. import {getPaginationTotalTitle} from "@/utils/common";
  144. interface siteModel {
  145. dataModel: any;
  146. }
  147. export default defineComponent({
  148. name:'SiteInfoEditForm',
  149. components: {BUploadFile},
  150. props: {
  151. loadData: {
  152. type: Function,
  153. default: null
  154. }
  155. },
  156. setup(props) {
  157. const visible = ref<boolean>(false);
  158. const isAllowCommit = ref<boolean>(false);
  159. const confirmLoading = ref<boolean>(false);
  160. const title = ref();
  161. const opCategory = ref<any>();
  162. const formState = reactive({
  163. total: 0,
  164. selectedRowKeys: [],
  165. loading: false
  166. });
  167. const formData = reactive<siteModel>({ dataModel:{}});
  168. const pageParams = reactive({
  169. pageIndex: 1,
  170. pageSize: 10,
  171. siteID:''
  172. });
  173. const columns: TableColumnsType = [
  174. {title: '序号', align: "center",key: 'siteUserID',customRender: item => `${pageParams.pageSize * (pageParams.pageIndex - 1) + item.index + 1}`},
  175. {title: '姓名', dataIndex: 'name', key: 'name', align: "center"},
  176. {title: '性别', dataIndex: 'genderName', key: 'genderName', align: "center"},
  177. {title: '角色', dataIndex: 'roleName', key: 'roleName', align: "center"},
  178. {title: '操作', key: 'operation', fixed: 'right',width:170, align: "center"},
  179. ];
  180. const pagination = computed(() => ({
  181. total: formState.total,
  182. current: pageParams.pageIndex,
  183. pageSize: pageParams.pageSize,
  184. showSizeChanger: true,
  185. showTotal: total => getPaginationTotalTitle(total)
  186. }));
  187. const onSelectChange = (selectedRowKeys: any) => {
  188. formState.selectedRowKeys = selectedRowKeys;
  189. };
  190. const handleTableChange: TableProps['onChange'] = (pag: { pageSize: number; current: number },) => {
  191. pageParams.pageIndex = pag.current;
  192. pageParams.pageSize = pag.pageSize;
  193. };
  194. const regionList = ref<SelectProps['options']>();
  195. const streetList = ref<SelectProps['options']>();
  196. const siteUserList = ref<SelectProps['options']>();
  197. const institutionList = ref<SelectProps["options"]>();
  198. const manageUsers = ref<any>([]);
  199. const allUsers = ref<any>([]);
  200. const getRegionList = async function(){
  201. const regionResult: any = await getRegionCodeList();
  202. regionList.value = regionResult;
  203. }
  204. const getStreetList = async function(){
  205. const streetResult: any = await getStreetCodeList(formData.dataModel.regionCode);
  206. streetList.value = streetResult;
  207. }
  208. const getUserDataList = async function(){
  209. const siteUserResult :any = await getSiteUserDataList();
  210. console.log('siteUserResult',siteUserResult);
  211. siteUserList.value = siteUserResult;
  212. }
  213. const getInstitutionList = async function(){
  214. const institutionResult :any = await getInstitutionDataList();
  215. console.log('institutionResult',institutionResult);
  216. institutionList.value = institutionResult;
  217. }
  218. const loadData = (siteID: string) => {
  219. getSiteByID(siteID).then((result: any) => {
  220. formData.dataModel = result;
  221. console.log("dataModel",formData.dataModel);
  222. getManageUsers(formData.dataModel.siteID);
  223. if (formData.dataModel.regionCode != null){
  224. getStreetList();
  225. }
  226. if (formData.dataModel.siteX !=null && formData.dataModel.siteY != null){
  227. formData.dataModel.sitePosition = "X:"+formData.dataModel.siteX+" Y:"+formData.dataModel.siteX;
  228. }
  229. });
  230. }
  231. const show = (id: any,method:string,category:any) => {
  232. title.value ="驿站站点管理-"+method;
  233. opCategory.value = category;
  234. getAllUsers();
  235. getRegionList();
  236. getInstitutionList();
  237. getUserDataList();
  238. loadData(id);
  239. visible.value = true;
  240. };
  241. const getAllUsers = () => {
  242. pageParams.siteID = '';
  243. getSiteUserList(pageParams).then((result :any) => {
  244. allUsers.value = result.list;
  245. console.log('allUsers',allUsers);
  246. })
  247. }
  248. const getManageUsers = (id: string) => {
  249. pageParams.siteID = id;
  250. getListBySiteID(pageParams).then((result :any)=> {
  251. manageUsers.value = result.list;
  252. });
  253. }
  254. const addSiteUser = () => {
  255. if(allUsers.value.length >0){
  256. const newUser = allUsers.value[0];
  257. (manageUsers.value as any[]).push({siteUserID:newUser.siteUserID,siteID:formData.dataModel.siteID,name:newUser.name,genderName:newUser.genderName,roleName:newUser.roleName});
  258. validateSameUser();
  259. }else{
  260. message.error("未查询到站点信息!");
  261. }
  262. }
  263. const delSiteUser = (site) =>{
  264. (manageUsers.value as any[]).splice(site, 1);
  265. validateSameUser();
  266. }
  267. const manageUsersChange = (index:any,siteUserID:any) =>{
  268. console.log('siteUserID',siteUserID);
  269. getSiteUserByID(siteUserID).then((result :any)=> {
  270. result.siteID = formData.dataModel.siteID;
  271. manageUsers.value[index]= result;
  272. console.log('manageUsers',manageUsers.value);
  273. validateSameUser();
  274. });
  275. }
  276. const validateSameUser = ()=>{
  277. isAllowCommit.value = true;
  278. if (manageUsers.value.length>1){
  279. manageUsers.value.forEach(item=>{
  280. const sameData = manageUsers.value.filter(x => x.siteUserID == item.siteUserID);
  281. console.log("sameData",sameData);
  282. if (sameData.length >1){
  283. isAllowCommit.value = false;
  284. }
  285. });
  286. }
  287. if (!isAllowCommit.value){
  288. message.error("不允许添加相同的人员!");
  289. }
  290. }
  291. const handleOk = () => {
  292. validateSameUser();
  293. if (isAllowCommit.value){
  294. formData.dataModel.manageUsers = manageUsers.value;
  295. saveSite(formData.dataModel).then(result => {
  296. if (result) {
  297. visible.value = false;
  298. props.loadData();
  299. }
  300. });
  301. }
  302. };
  303. const handleCancel = () => {
  304. visible.value = false;
  305. };
  306. return {
  307. ...toRefs(formData),
  308. title,
  309. opCategory,
  310. visible,
  311. formState,
  312. isAllowCommit,
  313. confirmLoading,
  314. columns,
  315. pageParams,
  316. pagination,
  317. regionList,
  318. streetList,
  319. siteUserList,
  320. institutionList,
  321. allUsers,
  322. manageUsers,
  323. show,
  324. onSelectChange,
  325. handleTableChange,
  326. getRegionList,
  327. getStreetList,
  328. getUserDataList,
  329. getInstitutionList,
  330. getAllUsers,
  331. addSiteUser,
  332. delSiteUser,
  333. manageUsersChange,
  334. handleOk,
  335. handleCancel
  336. };
  337. },
  338. created() {
  339. },
  340. })
  341. </script>