index.vue 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858
  1. <template>
  2. <div class="system-page config-page">
  3. <el-card class="page-card">
  4. <template #header>
  5. <div class="card-header">
  6. <div class="header-left">
  7. <el-icon :size="20" color="#409EFF">
  8. <OfficeBuilding/>
  9. </el-icon>
  10. <span class="page-title">本单位信息</span>
  11. </div>
  12. <div class="search-right">
  13. <el-button v-if="!editing" type="primary" @click="startEdit">
  14. <el-icon>
  15. <Edit/>
  16. </el-icon>
  17. 编辑
  18. </el-button>
  19. <el-button v-if="editing" type="primary" @click="submitForm" :loading="saving">
  20. <el-icon>
  21. <Check/>
  22. </el-icon>
  23. 保存
  24. </el-button>
  25. <el-button v-if="editing" @click="cancelEdit">取消</el-button>
  26. <el-button @click="refresh">
  27. <el-icon>
  28. <Refresh/>
  29. </el-icon>
  30. 刷新
  31. </el-button>
  32. </div>
  33. </div>
  34. </template>
  35. <el-form ref="formRef" :model="form" :rules="rules" label-width="190px" v-loading="loading"
  36. style="padding: 20px;">
  37. <!-- 水利机构 (orgType=1) 单位信息填报 -->
  38. <template v-if="form.type === '1'">
  39. <el-divider content-position="left">单位信息填报</el-divider>
  40. <el-row :gutter="20">
  41. <el-col :span="12">
  42. <el-form-item label="单位名称" prop="deptName">
  43. <el-input v-model="form.deptName" :disabled="!editing"/>
  44. </el-form-item>
  45. </el-col>
  46. <el-col :span="12">
  47. <el-form-item label="社会信用代码" prop="socCreCode">
  48. <el-input v-model="form.socCreCode" :disabled="!editing"/>
  49. </el-form-item>
  50. </el-col>
  51. <el-col :span="12">
  52. <AdSelect label="所属行政区" v-model="form.adGuid" :disabled="!editing"></AdSelect>
  53. </el-col>
  54. <el-col :span="12">
  55. <el-form-item label="单位地址" prop="addr">
  56. <el-input v-model="form.addr" :disabled="!editing"/>
  57. </el-form-item>
  58. </el-col>
  59. <el-col :span="12">
  60. <el-form-item label="行政管辖范围" prop="jurd">
  61. <el-input v-model="form.jurd" :disabled="!editing"/>
  62. </el-form-item>
  63. </el-col>
  64. <el-col :span="12">
  65. <el-form-item label="标准化等级" prop="stanGrad">
  66. <el-select v-model="form.stanGrad" :disabled="!editing" style="width:100%">
  67. <el-option v-for="d in slaj_stan_grad" :key="d.value" :label="d.label" :value="d.value"/>
  68. </el-select>
  69. </el-form-item>
  70. </el-col>
  71. <el-col :span="12">
  72. <el-form-item label="经费来源" prop="fundSour">
  73. <el-select v-model="form.fundSour" :disabled="!editing" style="width:100%">
  74. <el-option v-for="d in slaj_fund_sour" :key="d.value" :label="d.label" :value="d.value"/>
  75. </el-select>
  76. </el-form-item>
  77. </el-col>
  78. </el-row>
  79. <el-divider content-position="left">人员信息</el-divider>
  80. <el-row :gutter="20">
  81. <el-col :span="12">
  82. <el-form-item label="主要负责人" prop="leader">
  83. <el-input v-model="form.leader" :disabled="!editing"/>
  84. </el-form-item>
  85. </el-col>
  86. <el-col :span="12">
  87. <el-form-item label="主要负责人电话" prop="phone">
  88. <el-input v-model="form.phone" :disabled="!editing"/>
  89. </el-form-item>
  90. </el-col>
  91. <el-col :span="12">
  92. <el-form-item label="分管安全负责人" prop="safetyLegPers">
  93. <el-input v-model="form.safetyLegPers" :disabled="!editing"/>
  94. </el-form-item>
  95. </el-col>
  96. <el-col :span="12">
  97. <el-form-item label="分管安全负责人电话" prop="safetyLegPersTel">
  98. <el-input v-model="form.safetyLegPersTel" :disabled="!editing"/>
  99. </el-form-item>
  100. </el-col>
  101. <el-col :span="12">
  102. <el-form-item label="安全生产联系人" prop="safeProdConta">
  103. <el-input v-model="form.safeProdConta" :disabled="!editing"/>
  104. </el-form-item>
  105. </el-col>
  106. <el-col :span="12">
  107. <el-form-item label="安全生产联系人电话" prop="safeProdContaTel">
  108. <el-input v-model="form.safeProdContaTel" :disabled="!editing"/>
  109. </el-form-item>
  110. </el-col>
  111. </el-row>
  112. <el-divider content-position="left">其他信息</el-divider>
  113. <el-row :gutter="20">
  114. <el-col :span="12">
  115. <el-form-item label="从业人员人数" prop="workPopNum">
  116. <el-input v-model="form.workPopNum" :disabled="!editing" type="number" :min="0"/>
  117. </el-form-item>
  118. </el-col>
  119. <el-col :span="12">
  120. <el-form-item label="事故隐患内部举报奖励机制" prop="accReportMech">
  121. <el-select v-model="form.accReportMech" :disabled="!editing" style="width:100%">
  122. <el-option label="已建立" value="1"/>
  123. <el-option label="未建立" value="0"/>
  124. </el-select>
  125. </el-form-item>
  126. </el-col>
  127. </el-row>
  128. <el-divider content-position="left">附件上传</el-divider>
  129. <el-row :gutter="20">
  130. <el-col :span="24">
  131. <el-form-item label="标准化证书附件">
  132. <FileUpload v-model="form.stanCertFiles" :disabled="!editing" :limit="3" bizMedia
  133. bisTablename="ORG_MESSAGE" :bisGuid="form.deptId" bisRelColumns="标准化证书">
  134. </FileUpload>
  135. <div class="upload-notice">
  136. 本平台为互联网非涉密平台,严禁处理、传输国家秘密。请确认扫描、传输的文件资料不涉及国家秘密。
  137. </div>
  138. </el-form-item>
  139. </el-col>
  140. <el-col :span="24">
  141. <el-form-item label="营业执照附件">
  142. <FileUpload v-model="form.bizLicenseFiles" :disabled="!editing" :limit="3" bizMedia
  143. bisTablename="ORG_MESSAGE" :bisGuid="form.deptId" bisRelColumns="营业执照"/>
  144. <div class="upload-notice">
  145. 本平台为互联网非涉密平台,严禁处理、传输国家秘密。请确认扫描、传输的文件资料不涉及国家秘密。
  146. </div>
  147. </el-form-item>
  148. </el-col>
  149. <el-col :span="24">
  150. <el-form-item label="承诺书附件">
  151. <FileUpload v-model="form.pledgeFiles" :disabled="!editing" :limit="3" bizMedia
  152. bisTablename="ORG_MESSAGE" :bisGuid="form.deptId" bisRelColumns="承诺书"/>
  153. <div class="upload-notice">
  154. 本平台为互联网非涉密平台,严禁处理、传输国家秘密。请确认扫描、传输的文件资料不涉及国家秘密。
  155. </div>
  156. </el-form-item>
  157. </el-col>
  158. </el-row>
  159. </template>
  160. <!-- 参建单位 (orgType=2) -->
  161. <template v-if="form.type === '2'">
  162. <el-divider content-position="left">基础信息</el-divider>
  163. <el-row :gutter="20">
  164. <el-col :span="12">
  165. <el-form-item label="机构代码" prop="orgCode">
  166. <el-input v-model="form.orgCode" :disabled="!editing"/>
  167. </el-form-item>
  168. </el-col>
  169. <el-col :span="12">
  170. <el-form-item label="机构名称" prop="deptName">
  171. <el-input v-model="form.deptName" :disabled="!editing"/>
  172. </el-form-item>
  173. </el-col>
  174. <el-col :span="12">
  175. <el-form-item label="级别" prop="orgLevel">
  176. <el-select v-model="form.orgLevel" :disabled="!editing" style="width:100%">
  177. <el-option v-for="d in slaj_org_level" :key="d.value" :label="d.label" :value="d.value"/>
  178. </el-select>
  179. </el-form-item>
  180. </el-col>
  181. <el-col :span="12">
  182. <el-form-item label="单位类型" prop="orgType">
  183. <el-select v-model="form.orgType" :disabled="!editing" style="width:100%">
  184. <el-option v-for="d in UNIT_TYPE_OPTIONS" :key="d.value" :label="d.label" :value="d.value"/>
  185. </el-select>
  186. </el-form-item>
  187. </el-col>
  188. <el-col :span="12">
  189. <el-form-item label="顺序号" prop="ordernum">
  190. <el-input v-model="form.ordernum" :disabled="!editing"/>
  191. </el-form-item>
  192. </el-col>
  193. <el-col :span="12">
  194. <el-form-item label="状态" prop="status">
  195. <el-select v-model="form.status" :disabled="!editing" style="width:100%">
  196. <el-option v-for="d in slaj_org_status" :key="d.value" :label="d.label" :value="d.value"/>
  197. </el-select>
  198. </el-form-item>
  199. </el-col>
  200. <el-col :span="12">
  201. <el-form-item label="行政区划" prop="adCode">
  202. <el-input v-model="form.adCode" :disabled="!editing"/>
  203. </el-form-item>
  204. </el-col>
  205. <el-col :span="12">
  206. <el-form-item label="管辖范围" prop="jurd">
  207. <el-input v-model="form.jurd" :disabled="!editing"/>
  208. </el-form-item>
  209. </el-col>
  210. <el-col :span="12">
  211. <el-form-item label="区域类型" prop="areaType">
  212. <el-select v-model="form.areaType" :disabled="!editing" style="width:100%">
  213. <el-option v-for="d in slaj_area_type" :key="d.value" :label="d.label" :value="d.value"/>
  214. </el-select>
  215. </el-form-item>
  216. </el-col>
  217. <el-col :span="12">
  218. <el-form-item label="所属节点" prop="nodeCode">
  219. <el-input v-model="form.nodeCode" :disabled="!editing"/>
  220. </el-form-item>
  221. </el-col>
  222. <el-col :span="12">
  223. <el-form-item label="职责" prop="orgGrad">
  224. <el-input v-model="form.orgGrad" :disabled="!editing"/>
  225. </el-form-item>
  226. </el-col>
  227. </el-row>
  228. <el-divider content-position="left">扩展信息</el-divider>
  229. <el-row :gutter="20">
  230. <el-col :span="12">
  231. <el-form-item label="社会信用代码" prop="socCreCode">
  232. <el-input v-model="form.socCreCode" :disabled="!editing"/>
  233. </el-form-item>
  234. </el-col>
  235. <el-col :span="12">
  236. <el-form-item label="单位类型(客户端)" prop="orgClienType">
  237. <el-select v-model="form.orgClienType" :disabled="!editing" style="width:100%">
  238. <el-option v-for="d in slaj_org_clien_type" :key="d.value" :label="d.label" :value="d.value"/>
  239. </el-select>
  240. </el-form-item>
  241. </el-col>
  242. <el-col :span="12">
  243. <el-form-item label="单位编码" prop="wiunCode">
  244. <el-input v-model="form.wiunCode" :disabled="!editing"/>
  245. </el-form-item>
  246. </el-col>
  247. <el-col :span="12">
  248. <el-form-item label="注册名称" prop="regName">
  249. <el-input v-model="form.regName" :disabled="!editing"/>
  250. </el-form-item>
  251. </el-col>
  252. <el-col :span="12">
  253. <el-form-item label="法定代表人" prop="legRep">
  254. <el-input v-model="form.legRep" :disabled="!editing"/>
  255. </el-form-item>
  256. </el-col>
  257. <el-col :span="12">
  258. <el-form-item label="单位性质" prop="wiunProp">
  259. <el-select v-model="form.wiunProp" :disabled="!editing" style="width:100%">
  260. <el-option v-for="d in slaj_wiun_prop" :key="d.value" :label="d.label" :value="d.value"/>
  261. </el-select>
  262. </el-form-item>
  263. </el-col>
  264. <el-col :span="12">
  265. <el-form-item label="是否水利系统" prop="ifWateEnte">
  266. <el-select v-model="form.ifWateEnte" :disabled="!editing" style="width:100%">
  267. <el-option v-for="d in slaj_if_wate_ente" :key="d.value" :label="d.label" :value="d.value"/>
  268. </el-select>
  269. </el-form-item>
  270. </el-col>
  271. <el-col :span="12">
  272. <el-form-item label="是否项目法人单位" prop="isLegEnti">
  273. <el-select v-model="form.isLegEnti" :disabled="!editing" style="width:100%">
  274. <el-option v-for="d in slaj_is_leg_enti" :key="d.value" :label="d.label" :value="d.value"/>
  275. </el-select>
  276. </el-form-item>
  277. </el-col>
  278. <el-col :span="12">
  279. <el-form-item label="是否部直属单位" prop="ifMiniDire">
  280. <el-select v-model="form.ifMiniDire" :disabled="!editing" style="width:100%">
  281. <el-option v-for="d in slaj_if_mini_dire" :key="d.value" :label="d.label" :value="d.value"/>
  282. </el-select>
  283. </el-form-item>
  284. </el-col>
  285. <el-col :span="12">
  286. <el-form-item label="施工总承包资质" prop="contrQualGrad">
  287. <el-select v-model="form.contrQualGrad" :disabled="!editing" style="width:100%">
  288. <el-option v-for="d in slaj_contr_qual_grad" :key="d.value" :label="d.label" :value="d.value"/>
  289. </el-select>
  290. </el-form-item>
  291. </el-col>
  292. <el-col :span="12">
  293. <el-form-item label="施工总承包资质证书编号" prop="contrCertNum">
  294. <el-input v-model="form.contrCertNum" :disabled="!editing"/>
  295. </el-form-item>
  296. </el-col>
  297. <el-col :span="12">
  298. <el-form-item label="监理资质等级" prop="supQualGrad">
  299. <el-select v-model="form.supQualGrad" :disabled="!editing" style="width:100%">
  300. <el-option v-for="d in DPC_SUP_QUAL_GRAD" :key="d.value" :label="d.label" :value="d.value"/>
  301. </el-select>
  302. </el-form-item>
  303. </el-col>
  304. <el-col :span="12">
  305. <el-form-item label="标准化等级" prop="stanGrad">
  306. <el-select v-model="form.stanGrad" :disabled="!editing" style="width:100%">
  307. <el-option v-for="d in slaj_stan_grad" :key="d.value" :label="d.label" :value="d.value"/>
  308. </el-select>
  309. </el-form-item>
  310. </el-col>
  311. <el-col :span="12">
  312. <el-form-item label="标准化证书编号" prop="stanCertCode">
  313. <el-input v-model="form.stanCertCode" :disabled="!editing"/>
  314. </el-form-item>
  315. </el-col>
  316. <el-col :span="12">
  317. <el-form-item label="安全生产许可证编号" prop="safeProdLiceCode">
  318. <el-input v-model="form.safeProdLiceCode" :disabled="!editing"/>
  319. </el-form-item>
  320. </el-col>
  321. <el-col :span="12">
  322. <el-form-item label="经费来源" prop="fundSour">
  323. <el-select v-model="form.fundSour" :disabled="!editing" style="width:100%">
  324. <el-option v-for="d in slaj_fund_sour" :key="d.value" :label="d.label" :value="d.value"/>
  325. </el-select>
  326. </el-form-item>
  327. </el-col>
  328. <el-col :span="12">
  329. <el-form-item label="成立日期" prop="estDate">
  330. <el-date-picker v-model="form.estDate" type="date" value-format="YYYY-MM-DD" :disabled="!editing"
  331. style="width:100%"/>
  332. </el-form-item>
  333. </el-col>
  334. <el-col :span="12">
  335. <el-form-item label="注册资本(万元)" prop="regiCapi">
  336. <el-input v-model="form.regiCapi" :disabled="!editing" type="number" :min="0"/>
  337. </el-form-item>
  338. </el-col>
  339. <el-col :span="12">
  340. <el-form-item label="单位地址" prop="addr">
  341. <el-input v-model="form.addr" :disabled="!editing"/>
  342. </el-form-item>
  343. </el-col>
  344. <el-col :span="12">
  345. <el-form-item label="注册地址" prop="regLoc">
  346. <el-input v-model="form.regLoc" :disabled="!editing"/>
  347. </el-form-item>
  348. </el-col>
  349. </el-row>
  350. <el-divider content-position="left">备注</el-divider>
  351. <el-row :gutter="20">
  352. <el-col :span="24">
  353. <el-form-item label="备注" prop="note">
  354. <el-input v-model="form.note" :disabled="!editing" type="textarea" :rows="3"/>
  355. </el-form-item>
  356. </el-col>
  357. </el-row>
  358. </template>
  359. <!-- 分包单位 (orgType=3) -->
  360. <template v-if="form.type === '3'">
  361. <el-divider content-position="left">基本信息</el-divider>
  362. <el-row :gutter="20">
  363. <el-col :span="12">
  364. <el-form-item label="分包单位名称" prop="deptName">
  365. <el-input v-model="form.deptName" :disabled="!editing"/>
  366. </el-form-item>
  367. </el-col>
  368. <el-col :span="12">
  369. <el-form-item label="机构代码" prop="orgCode">
  370. <el-input v-model="form.orgCode" :disabled="!editing"/>
  371. </el-form-item>
  372. </el-col>
  373. <el-col :span="12">
  374. <el-form-item label="社会信用代码" prop="socCreCode">
  375. <el-input v-model="form.socCreCode" :disabled="!editing"/>
  376. </el-form-item>
  377. </el-col>
  378. <el-col :span="12">
  379. <el-form-item label="施工总承包资质" prop="contrQualGrad">
  380. <el-select v-model="form.contrQualGrad" :disabled="!editing" style="width:100%">
  381. <el-option v-for="d in slaj_contr_qual_grad" :key="d.value" :label="d.label" :value="d.value"/>
  382. </el-select>
  383. </el-form-item>
  384. </el-col>
  385. <el-col :span="12">
  386. <el-form-item label="单位类型" prop="orgType">
  387. <el-select v-model="form.orgType" :disabled="!editing" style="width:100%">
  388. <el-option v-for="d in UNIT_TYPE_OPTIONS" :key="d.value" :label="d.label" :value="d.value"/>
  389. </el-select>
  390. </el-form-item>
  391. </el-col>
  392. <el-col :span="12">
  393. <el-form-item label="单位规格" prop="orgLevel">
  394. <el-select v-model="form.orgLevel" :disabled="!editing" style="width:100%">
  395. <el-option v-for="d in slaj_org_level" :key="d.value" :label="d.label" :value="d.value"/>
  396. </el-select>
  397. </el-form-item>
  398. </el-col>
  399. <el-col :span="12">
  400. <el-form-item label="状态" prop="status">
  401. <el-select v-model="form.status" :disabled="!editing" style="width:100%">
  402. <el-option label="正常" value="0"/>
  403. <el-option label="停用" value="1"/>
  404. </el-select>
  405. </el-form-item>
  406. </el-col>
  407. </el-row>
  408. <el-divider content-position="left">人员信息</el-divider>
  409. <el-row :gutter="20">
  410. <el-col :span="12">
  411. <el-form-item label="项目负责人" prop="legPers">
  412. <el-input v-model="form.legPers" :disabled="!editing"/>
  413. </el-form-item>
  414. </el-col>
  415. <el-col :span="12">
  416. <el-form-item label="项目负责人电话" prop="legPersTel">
  417. <el-input v-model="form.legPersTel" :disabled="!editing"/>
  418. </el-form-item>
  419. </el-col>
  420. <el-col :span="12">
  421. <el-form-item label="安全员" prop="safePers">
  422. <el-input v-model="form.safePers" :disabled="!editing"/>
  423. </el-form-item>
  424. </el-col>
  425. <el-col :span="12">
  426. <el-form-item label="安全生产许可证编号" prop="safeProdLiceCode">
  427. <el-input v-model="form.safeProdLiceCode" :disabled="!editing"/>
  428. </el-form-item>
  429. </el-col>
  430. </el-row>
  431. <el-divider content-position="left">联系方式</el-divider>
  432. <el-row :gutter="20">
  433. <el-col :span="12">
  434. <el-form-item label="负责人" prop="leader">
  435. <el-input v-model="form.leader" :disabled="!editing"/>
  436. </el-form-item>
  437. </el-col>
  438. <el-col :span="12">
  439. <el-form-item label="联系电话" prop="phone">
  440. <el-input v-model="form.phone" :disabled="!editing"/>
  441. </el-form-item>
  442. </el-col>
  443. <el-col :span="12">
  444. <el-form-item label="邮箱" prop="email">
  445. <el-input v-model="form.email" :disabled="!editing"/>
  446. </el-form-item>
  447. </el-col>
  448. </el-row>
  449. </template>
  450. </el-form>
  451. </el-card>
  452. </div>
  453. </template>
  454. <script setup name="OrgInfo">
  455. import AdSelect from '@/components/AdSelect/index'
  456. import {getDept, updateDept} from '@/api/system/dept'
  457. import {getAttOrgExt, updateOrgWithDept} from '@/api/system/attOrgExt'
  458. import {getAttOrgUwatBase, updateAttOrgUwatBase} from '@/api/system/attOrgUwatBase'
  459. import {listAttOrgUwatExt, updateAttOrgUwatExt} from '@/api/system/attOrgUwatExt'
  460. import {getAttOrgWsub, updateOrgWsubWithDept} from '@/api/system/attOrgWsub'
  461. import useUserStore from '@/store/modules/user'
  462. import FileUpload from '@/components/FileUpload/index.vue'
  463. import {listMedia} from '@/api/slaj/eme'
  464. import {Check, Edit, OfficeBuilding, Refresh} from '@element-plus/icons-vue'
  465. import {UNIT_TYPE_OPTIONS, unitTypeToUwatExtType} from '@/utils/orgUnitType'
  466. const {proxy} = getCurrentInstance()
  467. const userStore = useUserStore()
  468. // 字典
  469. const {
  470. slaj_org_level, slaj_org_status, slaj_area_type,
  471. slaj_org_clien_type, slaj_wiun_prop, slaj_if_wate_ente,
  472. slaj_is_leg_enti, slaj_if_mini_dire, slaj_contr_qual_grad, DPC_SUP_QUAL_GRAD,
  473. slaj_stan_grad, slaj_fund_sour
  474. } = proxy.useDict(
  475. 'slaj_org_level', 'slaj_org_status', 'slaj_area_type',
  476. 'slaj_org_clien_type', 'slaj_wiun_prop', 'slaj_if_wate_ente',
  477. 'slaj_is_leg_enti', 'slaj_if_mini_dire', 'slaj_contr_qual_grad', 'DPC_SUP_QUAL_GRAD',
  478. 'slaj_stan_grad', 'slaj_fund_sour')
  479. const formRef = ref(null)
  480. const editing = ref(false)
  481. const saving = ref(false)
  482. const loading = ref(true)
  483. const originalForm = ref({})
  484. // 初始表单数据
  485. const EMPTY_FORM = {
  486. type: '', deptId: '', deptName: '', orgType: '', orgCode: '', leader: '', phone: '', email: '', status: '0', note: '',
  487. // 水利机构 — 填报字段
  488. socCreCode: '', adGuid: '', addr: '', jurd: '', stanGrad: '', fundSour: '',
  489. safetyLegPers: '', safetyLegPersTel: '', safeProdConta: '', safeProdContaTel: '',
  490. workPopNum: '', accReportMech: '',
  491. // 附件
  492. stanCertFiles: [], bizLicenseFiles: [], pledgeFiles: [],
  493. // 参建单位字段
  494. orgLevel: '', orgClienType: '', wiunCode: '', regName: '', legRep: '', wiunProp: '',
  495. estDate: '', regiCapi: '', regLoc: '', proOrgGuid: '',
  496. ifWateEnte: '', isLegEnti: '', ifMiniDire: '', adminWiunGuid: '',
  497. contrQualGrad: '', contrCertNum: '', supQualGrad: '', stanCertCode: '',
  498. safeProdLiceCode: '',
  499. ordernum: '', adCode: '', areaType: '', nodeCode: '', orgGrad: '',
  500. // 分包单位
  501. legPers: '', legPersTel: '', safePers: ''
  502. }
  503. const form = reactive({...EMPTY_FORM})
  504. const rules = {
  505. deptName: [{required: true, message: '单位名称不能为空', trigger: 'blur'}],
  506. socCreCode: [{required: true, message: '社会信用代码不能为空', trigger: 'blur'}],
  507. adGuid: [{required: true, message: '所属行政区不能为空', trigger: 'blur'}],
  508. stanGrad: [{required: true, message: '标准化等级不能为空', trigger: 'change'}],
  509. fundSour: [{required: true, message: '经费来源不能为空', trigger: 'change'}],
  510. leader: [{required: true, message: '主要负责人不能为空', trigger: 'blur'}],
  511. phone: [{
  512. required: true,
  513. message: '主要负责人电话不能为空',
  514. trigger: 'blur'
  515. }, {pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: '请输入正确的手机号码', trigger: 'blur'}],
  516. safetyLegPers: [{required: true, message: '分管安全负责人不能为空', trigger: 'blur'}],
  517. safetyLegPersTel: [{required: true, message: '分管安全负责人电话不能为空', trigger: 'blur'}],
  518. safeProdConta: [{required: true, message: '安全生产联系人不能为空', trigger: 'blur'}],
  519. safeProdContaTel: [{required: true, message: '安全生产联系人电话不能为空', trigger: 'blur'}],
  520. accReportMech: [{required: true, message: '事故隐患内部举报奖励机制不能为空', trigger: 'change'}]
  521. }
  522. /** 加载数据 */
  523. function loadData() {
  524. loading.value = true
  525. const orgGuid = userStore.orgGuid
  526. if (!orgGuid) {
  527. loading.value = false
  528. proxy.$modal.msgWarning('当前用户未关联任何单位,无法显示本单位信息')
  529. return
  530. }
  531. // 第一步:获取 orgType(sys_dept)
  532. getDept(orgGuid).then(res => {
  533. const dept = res.data
  534. if (!dept) {
  535. loading.value = false;
  536. proxy.$modal.msgWarning('未找到单位信息');
  537. return
  538. }
  539. // 页面分区:1 水利机构 / 2 参建单位 / 3 分包单位
  540. // 由 sys_dept.org_type 映射(1水利机构 2分包单位 3参建单位);旧数据 org_type 为空时按 org_check_type/type 兜底
  541. const orgTypeMap = {'1': '1', '3': '2', '2': '3'}
  542. form.type = orgTypeMap[dept.orgType]
  543. if (!form.type) {
  544. form.type = dept.orgCheckType === '1' ? '1'
  545. : (dept.type === '3' || dept.type === '4') ? '2'
  546. : dept.type || ''
  547. }
  548. if (form.type === '1') {
  549. // 水利机构:一个接口返回三表全部数据(后台 JOIN),前端只展示
  550. getAttOrgExt(orgGuid).then(r2 => {
  551. const data = r2.data
  552. if (data) {
  553. Object.assign(form, {...EMPTY_FORM})
  554. form.type = '1'
  555. form.deptId = data.deptId || ''
  556. form.deptName = data.deptName || ''
  557. form.orgType = data.orgType || ''
  558. form.leader = data.leader || ''
  559. form.phone = data.phone || ''
  560. form.email = data.email || ''
  561. form.status = data.status || '0'
  562. form.orgCode = data.orgCode || ''
  563. form.socCreCode = data.socCreCode || ''
  564. form.adGuid = data.adGuid || ''
  565. form.addr = data.addr || ''
  566. form.stanGrad = data.stanGrad || ''
  567. form.fundSour = data.fundSour || ''
  568. form.safetyLegPers = data.safetyLegPers || ''
  569. form.safetyLegPersTel = data.safetyLegPersTel || ''
  570. form.safeProdConta = data.safeProdConta || ''
  571. form.safeProdContaTel = data.safeProdContaTel || ''
  572. form.workPopNum = data.workPopNum || ''
  573. form.note = data.note || ''
  574. }
  575. loadAttachments(orgGuid, () => finishLoad())
  576. }).catch(() => {
  577. loadAttachments(orgGuid, () => finishLoad())
  578. })
  579. } else if (form.type === '2') {
  580. Promise.all([
  581. getAttOrgUwatBase(orgGuid),
  582. listAttOrgUwatExt({orgGuid, pageSize: 1})
  583. ]).then(([rBase, rExt]) => {
  584. const base = rBase.data
  585. form.deptId = orgGuid
  586. if (base) {
  587. form.orgCode = base.orgCode;
  588. form.orgLevel = base.orgLevel;
  589. form.orgType = base.orgType
  590. form.ordernum = base.ordernum;
  591. form.adCode = base.adCode
  592. form.jurd = base.jurd;
  593. form.areaType = base.areaType
  594. form.nodeCode = base.nodeCode;
  595. form.orgGrad = base.orgGrad
  596. form.status = base.status;
  597. form.note = base.note
  598. }
  599. const extRows = rExt.rows || []
  600. if (extRows.length) {
  601. const ext = extRows[0]
  602. form.socCreCode = ext.socCreCode;
  603. form.orgClienType = ext.orgClienType
  604. form.wiunCode = ext.wiunCode;
  605. form.regName = ext.regName
  606. form.legRep = ext.legRep;
  607. form.wiunProp = ext.wiunProp
  608. form.ifWateEnte = ext.ifWateEnte;
  609. form.isLegEnti = ext.isLegEnti
  610. form.ifMiniDire = ext.ifMiniDire;
  611. form.contrQualGrad = ext.contrQualGrad
  612. form.contrCertNum = ext.contrCertNum;
  613. form.supQualGrad = ext.supQualGrad
  614. form.stanGrad = ext.stanGrad;
  615. form.stanCertCode = ext.stanCertCode
  616. form.safeProdLiceCode = ext.safeProdLiceCode;
  617. form.fundSour = ext.fundSour
  618. form.estDate = ext.estDate;
  619. form.regiCapi = ext.regiCapi
  620. form.addr = ext.addr;
  621. form.regLoc = ext.regLoc;
  622. form.note = ext.note || form.note
  623. }
  624. finishLoad()
  625. }).catch(() => finishLoad())
  626. } else if (form.type === '3') {
  627. getAttOrgWsub(orgGuid).then(r2 => {
  628. const wsub = r2.data
  629. if (wsub) {
  630. form.deptId = orgGuid
  631. form.orgCode = wsub.orgCode || ''
  632. form.socCreCode = wsub.socCreCode;
  633. form.contrQualGrad = wsub.contrQualGrad
  634. form.legPers = wsub.legPers;
  635. form.legPersTel = wsub.legPersTel
  636. form.safePers = wsub.safePers;
  637. form.safeProdLiceCode = wsub.safeProdLiceCode
  638. form.orgType = wsub.orgType;
  639. form.orgLevel = wsub.orgLevel
  640. form.leader = wsub.leader || form.leader
  641. form.phone = wsub.phone || form.phone
  642. form.email = wsub.email || form.email
  643. }
  644. finishLoad()
  645. }).catch(() => finishLoad())
  646. } else {
  647. finishLoad()
  648. }
  649. }).catch(() => {
  650. loading.value = false
  651. proxy.$modal.msgError('加载单位信息失败,请稍后重试')
  652. })
  653. }
  654. function finishLoad() {
  655. originalForm.value = {...form}
  656. loading.value = false
  657. }
  658. /** 加载已上传的附件,每种附件使用独立的业务表名区分 */
  659. function loadAttachments(orgGuid, cb) {
  660. const tasks = [
  661. {field: 'stanCertFiles', tablename: 'ATT_ORG_EXT_STAN_CERT'},
  662. {field: 'bizLicenseFiles', tablename: 'ATT_ORG_EXT_BIZ_LICENSE'},
  663. {field: 'pledgeFiles', tablename: 'ATT_ORG_EXT_PLEDGE'}
  664. ]
  665. let loaded = 0
  666. tasks.forEach(({field, tablename}) => {
  667. listMedia(tablename, orgGuid).then(res => {
  668. const raw = res.data || res.rows || res
  669. form[field] = (Array.isArray(raw) ? raw : []).map(formatMedia)
  670. }).catch(() => {
  671. }).finally(() => {
  672. loaded++
  673. if (loaded === tasks.length && cb) cb()
  674. })
  675. })
  676. }
  677. /** 将服务端媒体记录转为 FileUpload 组件需要的格式 */
  678. function formatMedia(m) {
  679. const name = m.medName || m.medTitl || m.fileName || m.name || ''
  680. return {
  681. uid: m.guid || m.medGuid,
  682. name,
  683. guid: m.guid || m.medGuid,
  684. medGuid: m.guid || m.medGuid,
  685. medName: name,
  686. medTitl: name,
  687. medPath: m.medPath || '',
  688. url: m.medPath || ''
  689. }
  690. }
  691. function refresh() {
  692. editing.value = false;
  693. loadData()
  694. }
  695. function startEdit() {
  696. editing.value = true
  697. }
  698. function cancelEdit() {
  699. Object.assign(form, originalForm.value);
  700. editing.value = false;
  701. formRef.value?.resetFields()
  702. }
  703. function submitForm() {
  704. formRef.value?.validate(valid => {
  705. if (!valid) return
  706. saving.value = true
  707. let promise
  708. if (form.type === '1') {
  709. promise = updateOrgWithDept({
  710. dept: {
  711. deptId: form.deptId,
  712. deptName: form.deptName,
  713. leader: form.leader,
  714. phone: form.phone,
  715. email: form.email,
  716. status: form.status
  717. },
  718. ext: {
  719. guid: form.deptId,
  720. wiunName: form.deptName,
  721. orgGuid: form.deptId,
  722. socCreCode: form.socCreCode,
  723. adGuid: form.adGuid,
  724. addr: form.addr,
  725. stanGrad: form.stanGrad,
  726. fundSour: form.fundSour,
  727. safetyLegPers: form.safetyLegPers,
  728. safetyLegPersTel: form.safetyLegPersTel,
  729. safeProdConta: form.safeProdConta,
  730. safeProdContaTel: form.safeProdContaTel,
  731. workPopNum: form.workPopNum,
  732. note: form.note
  733. },
  734. orgCode: form.orgCode
  735. })
  736. } else if (form.type === '2') {
  737. promise = updateAttOrgUwatBase({
  738. guid: form.deptId, orgCode: form.orgCode, orgName: form.deptName, orgLevel: form.orgLevel,
  739. orgType: form.orgType, ordernum: form.ordernum, adCode: form.adCode, jurd: form.jurd,
  740. areaType: form.areaType, nodeCode: form.nodeCode, orgGrad: form.orgGrad, status: form.status, note: form.note
  741. }).then(() => {
  742. const extData = {
  743. guid: form.deptId,
  744. orgGuid: form.deptId,
  745. wiunName: form.deptName,
  746. socCreCode: form.socCreCode,
  747. orgClienType: form.orgClienType,
  748. orgType: unitTypeToUwatExtType(form.orgType),
  749. orgLevel: form.orgLevel,
  750. wiunCode: form.wiunCode,
  751. regName: form.regName,
  752. legRep: form.legRep,
  753. wiunProp: form.wiunProp,
  754. ifWateEnte: form.ifWateEnte,
  755. isLegEnti: form.isLegEnti,
  756. ifMiniDire: form.ifMiniDire,
  757. contrQualGrad: form.contrQualGrad,
  758. contrCertNum: form.contrCertNum,
  759. supQualGrad: form.supQualGrad,
  760. stanGrad: form.stanGrad,
  761. stanCertCode: form.stanCertCode,
  762. safeProdLiceCode: form.safeProdLiceCode,
  763. fundSour: form.fundSour,
  764. estDate: form.estDate,
  765. regiCapi: form.regiCapi,
  766. addr: form.addr,
  767. regLoc: form.regLoc,
  768. note: form.note
  769. }
  770. return Promise.all([
  771. extData.guid ? updateAttOrgUwatExt(extData) : Promise.resolve(),
  772. // 同步 sys_dept.type(单位类型:1水行政 2企事业单位 3施工 4监理)
  773. updateDept({deptId: form.deptId, type: form.orgType})
  774. ])
  775. })
  776. } else if (form.type === '3') {
  777. promise = updateOrgWsubWithDept({
  778. dept: {
  779. deptId: form.deptId,
  780. deptName: form.deptName,
  781. leader: form.leader,
  782. phone: form.phone,
  783. email: form.email,
  784. status: form.status
  785. },
  786. wsub: {
  787. guid: form.deptId,
  788. wiunWsubName: form.deptName,
  789. orgGuid: form.deptId,
  790. socCreCode: form.socCreCode,
  791. contrQualGrad: form.contrQualGrad,
  792. legPers: form.legPers,
  793. legPersTel: form.legPersTel,
  794. safePers: form.safePers,
  795. safeProdLiceCode: form.safeProdLiceCode
  796. },
  797. orgCode: form.orgCode, orgType: form.orgType, orgLevel: form.orgLevel
  798. })
  799. } else {
  800. promise = updateDept({
  801. deptId: form.deptId,
  802. deptName: form.deptName,
  803. leader: form.leader,
  804. phone: form.phone,
  805. email: form.email,
  806. status: form.status
  807. })
  808. }
  809. promise.then(() => {
  810. proxy.$modal.msgSuccess('保存成功')
  811. editing.value = false;
  812. saving.value = false
  813. loadData()
  814. }).catch(() => {
  815. saving.value = false
  816. })
  817. })
  818. }
  819. loadData()
  820. </script>
  821. <style scoped>
  822. .upload-notice {
  823. color: #e6a23c;
  824. font-size: 13px;
  825. margin-top: 4px;
  826. line-height: 1.6;
  827. }
  828. </style>