index.vue 58 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457
  1. <template>
  2. <fullscreen :fullscreen.sync="fullscreen" class="container">
  3. <div class="container-box">
  4. <toolList @iconCli='iconCli' :tooltit='tooltit'></toolList>
  5. <div class="search">
  6. <mySearch :searchList="searchList" @searchInfo="searchInfo"></mySearch>
  7. <div>
  8. <el-button type="primary" v-if="leader==='3'" @click="dialogCheck(2)" size="medium">下发</el-button>
  9. <el-button type="primary" v-if="leader==='0'" @click="shenpiAll('1','1')">通过</el-button>
  10. <el-button type="primary" v-if="leader==='0'" @click="shenpiAll('1','2')">打回</el-button>
  11. <el-button type="primary" v-if="leader==='1'" @click="shenpiAll('2','1')">通过</el-button>
  12. <el-button type="primary" v-if="leader==='1'" @click="shenpiAll('2','2')">打回</el-button>
  13. </div>
  14. </div>
  15. <div class="tabbox">
  16. <el-table height="calc(100% - 40px)" class="com-table" ref="multipleTable" :data="tableData"
  17. tooltip-effect="dark" size="small" border style="width: 100%"
  18. @selection-change="handleSelectionChange"
  19. >
  20. <el-table-column
  21. type="selection"
  22. width="55">
  23. </el-table-column>
  24. <el-table-column show-overflow-tooltip prop="content" label="稿件要求">
  25. </el-table-column>
  26. <el-table-column prop="beginTime" label="开始时间">
  27. </el-table-column>
  28. <el-table-column prop="endTime" label="结束时间">
  29. </el-table-column>
  30. <el-table-column prop="secname" label="科室">
  31. </el-table-column>
  32. <el-table-column prop="state" :formatter="stateFormat" label="状态">
  33. </el-table-column>
  34. <el-table-column prop="secLeaderName" label="科室负责人">
  35. <template slot-scope="scope">
  36. <span v-if="scope.row.state==='2'||scope.row.state==='0'" style="color: red">{{scope.row.secLeaderName}}</span>
  37. <span v-if="!(scope.row.state==='2'||scope.row.state==='0')">{{scope.row.secLeaderName}}</span>
  38. </template>
  39. </el-table-column>
  40. <el-table-column prop="departSlearderName" label="部门副总">
  41. <template slot-scope="scope">
  42. <span v-if="scope.row.state==='3'" style="color: red">
  43. {{scope.row.departSlearderName}}
  44. </span>
  45. <span v-if="scope.row.state!='3'">{{scope.row.departSlearderName}}</span>
  46. </template>
  47. </el-table-column>
  48. <el-table-column prop="workerName" label="填报人">
  49. <template slot-scope="scope">
  50. <span v-if="scope.row.state==='1'||scope.row.state==='5'" style="color: red">
  51. {{scope.row.workerName==null?'待分配':scope.row.workerName}}
  52. </span>
  53. <span v-if="!(scope.row.state==='1'||scope.row.state==='5')">
  54. {{scope.row.workerName==null?'待分配':scope.row.workerName}}
  55. </span>
  56. </template>
  57. </el-table-column>
  58. <el-table-column prop="createTime" label="下发时间">
  59. </el-table-column>
  60. <el-table-column label="操作" width="180px" align="center">
  61. <template slot-scope="scope">
  62. <el-button size="mini" type="primary" @click="dialogCheck(0,scope.row)">查看</el-button>
  63. <el-button size="mini" type="primary" v-if="scope.row.state==4" @click="dialogCheck(3,scope.row)">导出</el-button>
  64. </template>
  65. </el-table-column>
  66. </el-table>
  67. <el-pagination class="pageBox" @current-change="currchange" layout="prev, pager, next" background
  68. :total="total">
  69. </el-pagination>
  70. </div>
  71. </div>
  72. <el-dialog :title="titname" :visible.sync="dialogStatus" width="60%" :destroy-on-close="true"
  73. :modal-append-to-body="false" :close-on-click-modal="false" :before-close="closedia">
  74. <div >
  75. <el-form :model="infolist" ref="infolist" :rules="rules">
  76. <div>
  77. <el-form-item prop="beginTime" class="info-line online">
  78. <span>开始时间</span>
  79. <el-date-picker v-model="infolist.beginTime" type="datetime" placeholder="开始时间">
  80. </el-date-picker>
  81. </el-form-item>
  82. <el-form-item prop="endTime" class="info-line online">
  83. <span>结束时间</span>
  84. <el-date-picker v-model="infolist.endTime" type="datetime" placeholder="结束时间">
  85. </el-date-picker>
  86. </el-form-item>
  87. <el-form-item prop="content" class="info-line online">
  88. <span>要求</span>
  89. <el-input type="textarea" :rows="2" v-model="infolist.content" placeholder="要求" :disabled="disableStatus">
  90. </el-input>
  91. </el-form-item>
  92. <el-form-item prop="secIds" class="info-line online">
  93. <span>接收人</span>
  94. <el-select
  95. placeholder="选择接收人"
  96. v-model="infolist.secIds"
  97. multiple
  98. filterable
  99. >
  100. <el-option
  101. v-for="items in options"
  102. :key="items.value"
  103. :label="items.label"
  104. :value="items.value"
  105. >
  106. </el-option>
  107. </el-select>
  108. </el-form-item>
  109. </div>
  110. </el-form>
  111. <div slot="footer" style="padding-bottom: 20px;text-align: right;">
  112. <el-button type="primary" @click="dialogCliadd(2)">下 发</el-button>
  113. <!--todo-->
  114. <el-button @click="dialogCliadd(1)">取 消</el-button>
  115. </div>
  116. </div>
  117. </el-dialog>
  118. <!--工单处理-->
  119. <el-dialog :title="currentStateName" :visible.sync="dialogStatusadd" width="50%" :destroy-on-close="true"
  120. :modal="false" :before-close="closecldia" :fullscreen="true">
  121. <div >
  122. <el-form :model="infolist" ref="infolist" :rules="tbRules">
  123. <el-form-item prop="beginTime" class="info-line online">
  124. <span>开始时间</span>
  125. <el-date-picker v-model="infolist.beginTime" type="datetime" placeholder="开始时间" disabled>
  126. </el-date-picker>
  127. </el-form-item>
  128. <el-form-item prop="endTime" class="info-line online">
  129. <span>结束时间</span>
  130. <el-date-picker v-model="infolist.endTime" type="datetime" placeholder="结束时间" disabled>
  131. </el-date-picker>
  132. </el-form-item>
  133. <el-form-item prop="content" class="info-line online">
  134. <span>要求</span>
  135. <el-input type="textarea" :rows="2" v-model="infolist.content" placeholder="要求" disabled>
  136. </el-input>
  137. </el-form-item>
  138. <el-form-item prop="workerId" class="info-line online">
  139. <span>填报人</span>
  140. <el-select
  141. placeholder="选择填报人 "
  142. v-model="infolist.workerId"
  143. filterable
  144. :disabled="workIdDisabled"
  145. clearable
  146. >
  147. <el-option
  148. v-for="items in teamWorks"
  149. :key="items.loginNoStr"
  150. :label="items.loginNameStr"
  151. :value="items.loginNoStr"
  152. >
  153. </el-option>
  154. </el-select>
  155. </el-form-item>
  156. <el-form-item >
  157. <div class="container-box">
  158. <div class="search">
  159. <mySearch :searchList="gjsearchList" @searchInfo="gjsearchInfo"></mySearch>
  160. <div>
  161. <el-button type="primary" v-show="gjlistBtns" @click="dialogCheck(5)" size="medium">添加</el-button>
  162. <el-button type="primary" @click="downloadzip({'parentId':parentId})" size="medium">打包下载</el-button>
  163. </div>
  164. </div>
  165. <div class="tabbox">
  166. <el-table height="300px" class="com-table" ref="multipleTable" :data="gjinfoTableData"
  167. tooltip-effect="dark" size="small" border style="width: 100%">
  168. <el-table-column show-overflow-tooltip prop="gjUserName" label="撰稿人">
  169. </el-table-column>
  170. <el-table-column show-overflow-tooltip prop="content" label="稿件说明">
  171. </el-table-column>
  172. <el-table-column prop="files" label="文件">
  173. <template slot-scope="scope">
  174. <span v-html="fmtfiles(scope.row)"></span>
  175. </template>
  176. </el-table-column>
  177. <el-table-column label="操作" width="300px" align="center">
  178. <template slot-scope="scope">
  179. <el-button size="mini" type="primary" @click="dialogCheck(9,scope.row)">查看</el-button>
  180. <el-button size="mini" v-show="gjlistBtns" type="primary" @click="dialogCheck(6,scope.row)">编辑</el-button>
  181. <el-button size="mini" v-show="gjlistBtns" type="primary" @click="dialogCheck(7,scope.row)">删除</el-button>
  182. <el-button size="mini" type="primary" @click="downloadzip(scope.row)" >下载</el-button>
  183. </template>
  184. </el-table-column>
  185. </el-table>
  186. <el-pagination class="pageBox" @current-change="gjcurrchange" layout="prev, pager, next" background
  187. :total="gjTotal">
  188. </el-pagination>
  189. </div>
  190. </div>
  191. </el-form-item>
  192. </el-form>
  193. <div slot="footer" style="margin-top: 20px;margin-bottom: 20px;text-align: right;">
  194. <!--科室负责人提交分配-->
  195. <el-button v-show="assignDoneButton" @click="dialogCheck(4,infolist)">分配</el-button>
  196. <!--处理人处理提交-->
  197. <el-button v-show="addGjDoneButton" @click="dialogCheck(8,infolist)">提交审批</el-button>
  198. <!--科室经理审批-->
  199. <el-button v-show="ksPassBtn" @click="shenpi('3',infolist,'确定提交至部门副总审批?')">通过</el-button>
  200. <el-button v-show="ksReturnBtn" @click="shenpi('5',infolist,'确定打回至填报人填报?')">打回</el-button>
  201. <!--部门副总审批通过-->
  202. <el-button v-show="departsPassBtn" @click="shenpi('4',infolist,'确定提交至归档?')">通过</el-button>
  203. <el-button @click="closecldia">取 消</el-button>
  204. </div>
  205. </div>
  206. </el-dialog>
  207. <el-dialog :title="titname" :visible.sync="gjdialogstatus" width="60%" :destroy-on-close="true"
  208. :model="false" :append-to-body="true" :before-close="closegjdia">
  209. <div>
  210. <el-form :model="gjinfo" ref="gjinfo" :rules="gjRules">
  211. <el-form-item prop="gjUserId" class="info-line online">
  212. <span>撰稿人</span>
  213. <el-select
  214. placeholder="选择处理人 "
  215. v-model="gjinfo.gjUserId"
  216. filterable
  217. :disabled="gjdisabled"
  218. >
  219. <el-option
  220. v-for="items in teamWorks"
  221. :key="items.loginNoStr"
  222. :label="items.loginNameStr"
  223. :value="items.loginNoStr"
  224. >
  225. </el-option>
  226. </el-select>
  227. </el-form-item>
  228. <el-form-item prop="content" class="info-line online">
  229. <span>稿件说明</span>
  230. <el-input type="textarea" :rows="2" v-model="gjinfo.content" placeholder="要求" :disabled="gjdisabled">
  231. </el-input>
  232. </el-form-item>
  233. <el-form-item prop="files" class="info-line online">
  234. <span>文件列表</span>
  235. <!--upload-->
  236. <uploadNew v-if="rst" :itemId="parentId" @handleResult="handleUploadResult" :fList="gjinfo.files" type="0" btn="btn" ></uploadNew>
  237. </el-form-item>
  238. </el-form>
  239. <div slot="footer" style="padding-bottom: 20px;text-align: right;">
  240. <el-button type="primary" :disabled="gjdisabled" @click="dialogGjadd()">提 交</el-button>
  241. <el-button @click="closegjdia">取 消</el-button>
  242. </div>
  243. </div>
  244. </el-dialog>
  245. <myMessage :messTit='messTit' @closeMessage="closeMessage" :centerDialogVisible="centerDialogVisible"
  246. v-if="centerDialogVisible"></myMessage>
  247. </fullscreen>
  248. </template>
  249. <script>
  250. import mySearch from "../../../components/search.vue";
  251. import myMessage from "../../../components/myMessage.vue"
  252. import toolList from '../../../components/toolList'
  253. import uploadNew from '../../../components/uploadNew.vue'
  254. import {strToFileList} from "@/utils/tv.js"
  255. export default {
  256. components: {
  257. mySearch,
  258. myMessage,
  259. toolList,
  260. uploadNew
  261. },
  262. data() {
  263. const beginTime = (rule, value, callback) => {
  264. if (!this.infolist.beginTime) {
  265. callback(new Error('不能为空'))
  266. } else {
  267. callback()
  268. }
  269. }
  270. const endTime = (rule, value, callback) => {
  271. if (!this.infolist.beginTime) {
  272. callback(new Error('不能为空'))
  273. } else {
  274. callback()
  275. }
  276. }
  277. const content = (rule, value, callback) => {
  278. if (!this.infolist.content) {
  279. callback(new Error('不能为空'))
  280. } else {
  281. callback()
  282. }
  283. }
  284. const secIds = (rule, value, callback) => {
  285. console.info('valid secIds -> ',this.infolist.secIds)
  286. if (!this.infolist.secIds||this.infolist.secIds.length==0) {
  287. callback(new Error('不能为空'))
  288. } else {
  289. callback()
  290. }
  291. }
  292. const workIds = (rule, value, callback) => {
  293. console.info('valid workerId -> ',this.infolist.workerId)
  294. if (!this.infolist.workerId||this.infolist.workerId=='') {
  295. callback(new Error('不能为空'))
  296. } else {
  297. callback()
  298. }
  299. }
  300. const gjUserId = (rule, value, callback) => {
  301. if (!this.gjinfo.gjUserId) {
  302. callback(new Error('不能为空'))
  303. } else {
  304. callback()
  305. }
  306. }
  307. const gjContent = (rule, value, callback) => {
  308. if (!this.gjinfo.content) {
  309. callback(new Error('不能为空'))
  310. } else {
  311. callback()
  312. }
  313. }
  314. const files = (rule, value, callback) => {
  315. if (!this.gjinfo.files) {
  316. callback(new Error('不能为空'))
  317. } else {
  318. callback()
  319. }
  320. }
  321. return {
  322. //权限控制属性
  323. workIdDisabled:false,
  324. assignDoneButton:false,
  325. addGjDoneButton:false,
  326. ksPassBtn:false,
  327. ksReturnBtn:false,
  328. departsPassBtn:false,
  329. gjlistBtns:false,
  330. tbRules:{
  331. workerId: [{
  332. required: true,
  333. trigger: 'change',
  334. validator: workIds
  335. }],
  336. },
  337. rules: {
  338. beginTime: [{
  339. required: true,
  340. trigger: 'change',
  341. validator: beginTime
  342. }],
  343. endTime: [{
  344. required: true,
  345. trigger: 'change',
  346. validator: endTime
  347. }],
  348. content: [{
  349. required: true,
  350. trigger: 'change',
  351. validator: content
  352. }],
  353. secIds: [{
  354. required: true,
  355. trigger: 'change',
  356. validator: secIds
  357. }],
  358. },
  359. gjRules: {
  360. gjUserId: [{
  361. required: true,
  362. trigger: 'change',
  363. validator: gjUserId
  364. }],
  365. content: [{
  366. required: true,
  367. trigger: 'change',
  368. validator: gjContent
  369. }],
  370. files: [{
  371. required: true,
  372. trigger: 'change',
  373. validator: files
  374. }],
  375. },
  376. searchList: [{
  377. type: 'input',
  378. tit: '稿件要求',
  379. value: '',
  380. width: '98%'
  381. },{
  382. type: 'sel',
  383. tit: '工单状态',
  384. value: '',
  385. width: '98%',
  386. options: [{dataName:'科室经理分配',dataCode:'0'},
  387. {dataName:'填报人填报',dataCode:'1'},
  388. {dataName:'科室经理审核',dataCode:'2'},
  389. {dataName:'部门副总审核',dataCode:'3'},
  390. {dataName:'归档',dataCode:'4'},
  391. {dataName:'打回重新填写',dataCode:'5'}]
  392. }],
  393. gjsearchList: [{
  394. type: 'input',
  395. tit: '稿件说明',
  396. value: '',
  397. width: '98%'
  398. }],
  399. tooltit: '稿件管理',
  400. fullscreen: false,
  401. total: 0,
  402. pageSize: 1,
  403. tableData: [{}],
  404. gjinfoTableData:[{}],
  405. dialogStatus: false,
  406. disableStatus: false,
  407. titname: '',
  408. infolist: {
  409. beginTime:'',
  410. endTime:'',
  411. content: '',
  412. secid: '',
  413. secname:'',
  414. departSlearder:'',
  415. departSlearderName:'',
  416. secLeader:'',
  417. secLeaderName:'',
  418. deptTime: '',
  419. workerId:'',
  420. workerName:'',
  421. createTime:'',
  422. createUser:'',
  423. secIds: []
  424. },
  425. userInfo: {},
  426. params: {},
  427. centerDialogVisible: false,
  428. messTit: '',
  429. loading: false,
  430. loadinged: false,
  431. dialogStatusadd: false,
  432. choleader: false,
  433. treeListonly: {},
  434. defaultList: [],
  435. closeList: false,
  436. visionchonly: false,
  437. depttype: 0,
  438. sts: 0,
  439. leader: '3', //// 0 科室负责人, 1 副总 2 正总 3 发起人 4 提交人
  440. situation: '0',
  441. options: [],
  442. stateMap: {'0':'科室经理分配','1':'填报人填报','2':'科室经理审核','3':'部门副总审核','4':'归档','5':'打回重新填写'},
  443. roleMap: {},
  444. /**
  445. * {'liujie5':0,
  446. 'zhaohongsong':0,
  447. 'lifangyan':0,
  448. 'chenliang1':0,
  449. 'sunzhen':0,
  450. 'sunchuan':0,
  451. 'weilinna':0,
  452. 'qiuyu':1,
  453. 'guopeng':1,
  454. 'zhudongzhao':1}
  455. */
  456. type: this.$route.meta.type,
  457. teamWorks:[],
  458. rstfm: true,
  459. selWos:[],
  460. //gj
  461. gjdialogstatus:false,
  462. gjinfo:{
  463. id:'',
  464. gjUserId:'',
  465. gjUserName:'',
  466. content:'',
  467. files:'',
  468. parentId:'',
  469. status:'',
  470. createUser:'',
  471. createTime:''
  472. },
  473. gjparams: {},
  474. gjTotal: 0,
  475. gjPageSize: 1,
  476. parentId:'',
  477. currentStateName:'',
  478. fileDataList: '',
  479. uploadstatus:false,
  480. gjdisabled:false,
  481. rst:false
  482. }
  483. },
  484. methods: {
  485. handleSelectionChange(val){
  486. this.selWos=val
  487. },
  488. closegjdia(){
  489. console.info('close gj dialog')
  490. this.gjinfo = {
  491. id:'',
  492. gjUserId:'',
  493. gjUserName:'',
  494. content:'',
  495. files:'',
  496. parentId:'',
  497. status:'',
  498. createUser:'',
  499. createTime:''
  500. }
  501. this.gjdialogstatus=false
  502. },
  503. closecldia(){
  504. console.info('close gj dialog')
  505. this.dialogStatusadd=false
  506. },
  507. stateFormat(row) {
  508. return this.stateMap[row.state]
  509. },
  510. fmtfiles(row){
  511. if(row.files){
  512. console.info('row.files --> ',row.files)
  513. let fileStr=""
  514. let files=strToFileList(row.files)
  515. console.info('files -> ',files)
  516. files.forEach(function(item){
  517. fileStr+=item.name+' <br/>'
  518. })
  519. console.info('fileStr',fileStr)
  520. return fileStr
  521. }
  522. return '-'
  523. },
  524. getOpations() {
  525. this.$http({
  526. url: "/market/techcentergj/queryLeaderList",
  527. method: "post",
  528. headers: {
  529. "Content-Type": "application/json",
  530. },
  531. data: {},
  532. }).then((res) => {
  533. res.data.map((item) => {
  534. this.options.push({
  535. label: item.ou+'->'+item.secLeaderName,
  536. value: item.secLeaderLogin,
  537. secId: item.o,
  538. secName: item.ou,
  539. o: item.o,
  540. ou: item.ou,
  541. secLeaderLogin: item.secLeaderLogin,
  542. secLeaderName: item.secLeaderName,
  543. departSleaderLogin: item.departSleaderLogin,
  544. departSleaderName: item.departSleaderName
  545. });
  546. });
  547. });
  548. },
  549. choseleader(v) {
  550. this.leader = v;
  551. if (v == 3) {
  552. this.dialogCliadds(3);
  553. } else {
  554. this.choleader = true;
  555. }
  556. },
  557. treeCheckonly(v) {
  558. this.treeListonly = v;
  559. },
  560. //搜索数据
  561. searchInfo(v) {
  562. this.params = {};
  563. v[0] ? this.params.content = v[0] : '';
  564. v[1] ? this.params.state = v[1] : '';
  565. this.getList(this.params, this.pageSize);
  566. },
  567. gjsearchInfo(v) {
  568. this.gjparams = {};
  569. v[0] ? this.gjparams.content = v[0] : '';
  570. this.getGjList(this.gjparams, this.pageSize);
  571. },
  572. closedia() {
  573. this.infolist = {
  574. beginTime:'',
  575. endTime:'',
  576. content: '',
  577. secid: '',
  578. secname:'',
  579. departSlearder:'',
  580. departSlearderName:'',
  581. secLeader:'',
  582. secLeaderName:'',
  583. deptTime: '',
  584. workerId:'',
  585. workerName:'',
  586. createTime:'',
  587. createUser:'',
  588. secIds: []
  589. };
  590. this.dialogStatus = false;
  591. },
  592. rstSituation (n) {
  593. let state=n.state
  594. console.info('--this.leader-->',this.leader)
  595. console.info('----state----',state)
  596. //leader 0 科室负责人, 1 副总 2 正总 3 发起人 4 提交人
  597. //state {'0':'科室经理分配','1':'填报人填报','2':'科室经理审核','3':'部门副总审核','4':'归档','5':'打回重新填写'}
  598. // 人 人可能遇到的各种情况 ==> 各种情况下的表单样式
  599. // '0' 科室负责人 0分配,2 审核, r 读,x 写
  600. this.currentStateName=this.stateMap[state]
  601. if(this.leader=='0'){
  602. this.departsPassBtn=false
  603. if(state=='0'){
  604. //科室经理分配,操作
  605. this.situation='00x'
  606. this.workIdDisabled=false
  607. this.assignDoneButton=true;
  608. this.addGjDoneButton=false
  609. //科室经理审批通过按钮
  610. this.ksPassBtn=false
  611. this.ksReturnBtn=false
  612. this.gjlistBtns=false
  613. }else if(state=='2'){
  614. //审批,操作
  615. this.situation='02x'
  616. this.workIdDisabled=true;
  617. this.assignDoneButton=false
  618. this.addGjDoneButton=false
  619. //科室经理审批通过,打回按钮
  620. this.ksPassBtn=true
  621. this.ksReturnBtn=true
  622. this.gjlistBtns=false
  623. //todo 科室经理分配给自己处理 state=1 workerId=loginNoStr
  624. }else if((state=='1'||state=='5')&&this.userInfo.loginNoStr==n.workerId){
  625. this.situation='41x'
  626. this.workIdDisabled=true;
  627. this.assignDoneButton=false
  628. this.addGjDoneButton=true
  629. this.gjlistBtns=true
  630. //科室经理审批通过按钮
  631. this.ksPassBtn=false
  632. this.ksReturnBtn=false
  633. }else{
  634. //科室经理查看,没有操作权限,只读。
  635. this.situation='0r'
  636. this.workIdDisabled=true;
  637. this.assignDoneButton=false
  638. this.addGjDoneButton=false
  639. this.gjlistBtns=false
  640. //科室经理审批通过按钮
  641. this.ksPassBtn=false
  642. this.ksReturnBtn=false
  643. }
  644. }else if(this.leader=='4'){
  645. //科室经理审批通过按钮
  646. this.ksPassBtn=false
  647. this.ksReturnBtn=false
  648. this.departsPassBtn=false
  649. //提交人提交。
  650. if(state=='1'||state=='5'){
  651. //提交人提交,操作
  652. this.situation='41x'
  653. this.workIdDisabled=true;
  654. this.assignDoneButton=false
  655. this.addGjDoneButton=true
  656. this.gjlistBtns=true
  657. }else{
  658. //提交人提交查看,只读
  659. this.situation='4r'
  660. this.workIdDisabled=true;
  661. this.assignDoneButton=false
  662. this.addGjDoneButton=false
  663. this.gjlistBtns=false
  664. }
  665. }else if(this.leader=='1'){
  666. //科室经理审批通过按钮
  667. this.ksPassBtn=false
  668. this.gjlistBtns=false
  669. this.addGjDoneButton=false
  670. //副总
  671. if(state=='3'){
  672. //副总审核,操作
  673. this.situation='3x'
  674. this.workIdDisabled=true;
  675. this.assignDoneButton=false
  676. this.ksReturnBtn=true
  677. this.departsPassBtn=true
  678. }else{
  679. //副总审核,只读
  680. this.situation='1r'
  681. this.workIdDisabled=true;
  682. this.assignDoneButton=false
  683. this.ksReturnBtn=false
  684. this.departsPassBtn=false
  685. }
  686. }else if(this.leader=='3'){
  687. //科室经理审批通过按钮
  688. this.ksPassBtn=false
  689. this.ksReturnBtn=false
  690. this.departsPassBtn=false
  691. this.gjlistBtns=false
  692. this.addGjDoneButton=false
  693. //只读
  694. this.situation='3r'
  695. this.workIdDisabled=true;
  696. this.assignDoneButton=false
  697. }
  698. //刷新表单
  699. this.rstfm = false
  700. this.$nextTick(() => {
  701. this.rstfm = true
  702. })
  703. console.info(':---situation--->',this.situation)
  704. },
  705. resetRole(){
  706. // 处理按钮,根据 leader(角色) 和 state 决定展示什么按钮,控制页面权限。
  707. // 0 科室负责人, 1 副总 2 正总 3 发起人 4 提交人
  708. this.userInfo=JSON.parse(window.sessionStorage.userInfo)
  709. //看当前登陆人的角色是谁,决定查什么列表
  710. let type=this.$route.meta.type;
  711. //type=1 发起人查看的列表
  712. if(type==1){
  713. console.info('---》type',type);
  714. this.params.createUser=this.userInfo.loginNoStr
  715. this.params.roleType='D'
  716. this.leader='3'
  717. this.type='1'
  718. }else{
  719. //提交人,科室经理,部门副总
  720. if(this.roleMap[this.userInfo.loginNoStr]){
  721. this.leader=this.roleMap[this.userInfo.loginNoStr]
  722. //科室经理
  723. if(this.roleMap[this.userInfo.loginNoStr]=='0'){
  724. this.params.secLeader=this.userInfo.loginNoStr
  725. }else if(this.roleMap[this.userInfo.loginNoStr]=='1'){
  726. //部门副总
  727. this.params.departSlearder = this.userInfo.loginNoStr
  728. }
  729. }else{
  730. this.params.workerId=this.userInfo.loginNoStr
  731. this.leader='4'
  732. }
  733. }
  734. console.info('rolesearchparam',this.params);
  735. //根据当前状态更新操作列表中,各个按钮的显示状态。当前登陆人角色,当前状态是当前登陆人需要处理的,则显示处理按钮,否则展示查看按钮。
  736. //resetbutton.
  737. },
  738. //获取列表
  739. getList(v, n) {
  740. //根据当前登陆人的角色。刷新查询条件。
  741. if(Object.keys (this.roleMap).length ===0){
  742. let _that=this;
  743. this.getShrole(function(){
  744. console.info('yes in getlist,this.roleMap====',_that.roleMap)
  745. _that.resetRole();
  746. _that.pageSize = n;
  747. console.info('begin query-->',_that.params)
  748. _that.$http({
  749. url: "/market/techcentergj/queryPage",
  750. method: "post",
  751. headers: {
  752. "Content-Type": "application/json",
  753. "page": '{"pageNo":"' + n + '","pageSize":"10"}'
  754. },
  755. data: _that.params,
  756. }).then((res) => {
  757. _that.tableData = res.data.data;
  758. _that.total = res.data.totalRecord;
  759. });
  760. });
  761. }else{
  762. this.resetRole();
  763. this.pageSize = n;
  764. this.$http({
  765. url: "/market/techcentergj/queryPage",
  766. method: "post",
  767. headers: {
  768. "Content-Type": "application/json",
  769. "page": '{"pageNo":"' + n + '","pageSize":"10"}'
  770. },
  771. data: this.params,
  772. }).then((res) => {
  773. this.tableData = res.data.data;
  774. this.total = res.data.totalRecord;
  775. });
  776. }
  777. },
  778. //获取人员角色map.
  779. getShrole(callback){
  780. this.$http({
  781. url: "/market/techcentergj/shrole",
  782. method: "post",
  783. headers: {
  784. "Content-Type": "application/json",
  785. },
  786. data: {pdepartO:'00440063000000000000'},
  787. }).then((res) => {
  788. this.roleMap = res.data.body
  789. callback()
  790. });
  791. },
  792. // 分页
  793. currchange(v) {
  794. this.pageSize = v;
  795. this.getList(this.params, this.pageSize);
  796. },
  797. gjcurrchange(v){
  798. this.gjpageSize = v;
  799. this.getGjList(this.gjparams, this.gjpageSize);
  800. },
  801. //申请
  802. dialogCheck(v, n) {
  803. //0 查看 1 处理,判断当前环节,和当前人员。 2 下发
  804. console.info('row',n);
  805. if (v === 0) {
  806. this.rstSituation(n)
  807. this.titname = '查看';
  808. this.dialogStatusadd = true;
  809. this.disableStatus = false;
  810. this.sts = 0
  811. this.infolist=n
  812. this.parentId=n.id
  813. this.getGjList({},1)
  814. } else if (v === 1) {
  815. this.titname = '处理';
  816. this.dialogStatusadd = true;
  817. this.disableStatus = false;
  818. return
  819. } else if (v === 2) {
  820. this.titname = '下发';
  821. this.dialogStatus = true;
  822. this.disableStatus = false;
  823. return
  824. } else if (v===3) {
  825. console.info('下载')
  826. this.downloadzip({'parentId':n.id})
  827. } else if (v===4){
  828. //科室负责人提交分配菜单。
  829. this.infolist.state='1'
  830. this.assign()
  831. } else if (v===5){
  832. //添加稿件
  833. this.gjdialogstatus=true
  834. this.rst=false
  835. this.$nextTick(()=>{
  836. this.rst=true
  837. })
  838. } else if(v===6){
  839. //编辑稿件
  840. this.gjdialogstatus=true
  841. this.gjdisabled=false
  842. this.gjinfo=n
  843. this.rst=false
  844. this.$nextTick(()=>{
  845. this.rst=true
  846. })
  847. } else if(v===7){
  848. //删除稿件
  849. this.dialogGjdel(n)
  850. } else if(v===8){
  851. this.commitGj(n)
  852. } else if(v===9){
  853. this.gjdialogstatus=true
  854. this.gjdisabled=true
  855. this.gjinfo=n
  856. this.rst=false
  857. this.$nextTick(()=>{
  858. this.rst=true
  859. })
  860. }
  861. },
  862. //添加
  863. dialogCliadd(v) {
  864. if (v == 1) {
  865. this.infolist = {
  866. beginTime:'',
  867. endTime:'',
  868. content: '',
  869. secid: '',
  870. secname:'',
  871. departSlearder:'',
  872. departSlearderName:'',
  873. secLeader:'',
  874. secLeaderName:'',
  875. deptTime: '',
  876. workerId:'',
  877. workerName:'',
  878. createTime:'',
  879. createUser:'',
  880. secIds: []
  881. };
  882. this.dialogStatus = false;
  883. return
  884. }
  885. let _this = this;
  886. let info = this.infolist;
  887. info.createTime = _this.$formatDate(new Date(), "YYYY-MM-DD");
  888. info.createUser = this.userInfo.loginNo;
  889. info.beginTime = info.beginTime ? _this.$formatDate(info.beginTime, "YYYY-MM-DD HH:mm") : '';
  890. info.endTime = info.endTime ? _this.$formatDate(info.endTime, "YYYY-MM-DD HH:mm") : '';
  891. let secs = []
  892. this.infolist.secIds.map((item) => {
  893. this.options.map((row) => {
  894. if (item == row.value) {
  895. secs.push(row);
  896. }
  897. });
  898. });
  899. info.secIds=secs
  900. console.info('secs',info.secIds)
  901. if (this.titname == '修改') {
  902. this.submitInfo("/market/techcentergj/add", info);
  903. } else {
  904. console.info('submitinfo',info);
  905. this.submitInfo("/market/techcentergj/add", info);
  906. }
  907. },
  908. assign(){
  909. //分配 update
  910. console.info('asign:->',this.infolist)
  911. let info={}
  912. info.workerId=this.infolist.workerId
  913. info.state='1'
  914. info.id=this.infolist.id
  915. //workName
  916. this.teamWorks.map((item) => {
  917. console.info('-->item:',item)
  918. if(item.loginNoStr==info.workerId){
  919. info.workerName=item.loginNameStr
  920. }
  921. });
  922. console.info('----info---->',info)
  923. this.submitInfo("/market/techcentergj/update", info);
  924. },
  925. //提交人 提交审批
  926. commitGj(n){
  927. //确定提交么
  928. this.$confirm("确定提交到科室经理审批?", "提示", {
  929. confirmButtonText: "确定",
  930. cancelButtonText: "取消",
  931. type: "warning",
  932. }).then(() => {
  933. console.info('---->commitGj',n)
  934. if(this.gjinfoTableData.length==0){
  935. this.$message('请添加稿件!')
  936. return
  937. }
  938. let info={}
  939. //info.workerId=this.infolist.workerId
  940. info.state='2'
  941. info.id=this.infolist.id
  942. this.submitInfo("/market/techcentergj/update", info);
  943. }).catch(() => {});
  944. },
  945. //审批
  946. shenpi(dstState,n,message){
  947. //确定提交么
  948. this.$confirm(message, "提示", {
  949. confirmButtonText: "确定",
  950. cancelButtonText: "取消",
  951. type: "warning",
  952. }).then(() => {
  953. console.info('---->shenhe',n)
  954. let info={}
  955. info.state=dstState
  956. info.id=this.infolist.id
  957. this.submitInfo("/market/techcentergj/update", info);
  958. }).catch(() => {});
  959. },
  960. //type 1 科室经理审批 state (通过 2->3 打回 2-》5) ,2 部门副总审批 (通过 3-》4 ,打回 3-》5)
  961. //act 1 通过 2 打回
  962. shenpiAll(type,act){
  963. if(this.selWos.length===0){
  964. this.$message({message: '请选择待审批工单!',
  965. type: 'error'})
  966. return
  967. }
  968. let destState='';
  969. let msg='';
  970. if(type=='1'&&act=='1'){
  971. destState='3'
  972. msg='确定批量通过所选工单?'
  973. }else if(type=='1'&&act=='2'){
  974. destState='5'
  975. msg='确定批量打回所选工单?'
  976. }else if(type=='2'&&act=='1'){
  977. destState='4'
  978. msg='确定批量通过所选工单?'
  979. }else if(type=='2'&&act=='2') {
  980. destState = '5'
  981. msg = '确定批量打回所选工单?'
  982. }else{
  983. this.$message('error');
  984. return
  985. }
  986. let _this=this
  987. let done=true;
  988. this.selWos.forEach(function(item){
  989. if(type=='1'&&item.state!='2'){
  990. _this.$message({
  991. message: '请选择:【科室经理审核】 状态的工单!',
  992. type: 'error'
  993. })
  994. done=false
  995. return
  996. }
  997. if(type=='2'&&item.state!='3'){
  998. _this.$message({
  999. message: '请选择:【部门副总审核】 状态的工单!',
  1000. type: 'error'
  1001. })
  1002. done=false
  1003. return
  1004. }
  1005. item.state=destState
  1006. })
  1007. //提交。
  1008. if(done){
  1009. this.$confirm(msg, "提示", {
  1010. confirmButtonText: "确定",
  1011. cancelButtonText: "取消",
  1012. type: "warning",
  1013. }).then(() => {
  1014. this.$http({
  1015. url: '/market/infotech/updateBatch',
  1016. method: "post",
  1017. headers: {
  1018. "Content-Type": "application/json",
  1019. },
  1020. data: JSON.stringify(this.selWos),
  1021. }).then((res) => {
  1022. if (res.data.result === 1) {
  1023. _this.$message({
  1024. message: res.data.desc,
  1025. type: 'error'
  1026. });
  1027. } else {
  1028. _this.$message({
  1029. message: '成功',
  1030. type: 'success'
  1031. });
  1032. _this.getList(this.params, this.pageSize);
  1033. }
  1034. });
  1035. }).catch(() => {});
  1036. }
  1037. }
  1038. //添加
  1039. ,submitInfo(u, v) {
  1040. let _this = this;
  1041. this.$refs.infolist.validate(valid => {
  1042. if (valid) {
  1043. this.$http({
  1044. url: u,
  1045. method: "post",
  1046. headers: {
  1047. "Content-Type": "application/json",
  1048. },
  1049. data: v,
  1050. }).then((res) => {
  1051. if (res.data.result === 1) {
  1052. _this.$message({
  1053. message: res.data.desc,
  1054. type: 'error'
  1055. });
  1056. } else {
  1057. _this.$message({
  1058. message: '成功',
  1059. type: 'success'
  1060. });
  1061. _this.closedia();
  1062. _this.infolist = {
  1063. beginTime:'',
  1064. endTime:'',
  1065. content: '',
  1066. secid: '',
  1067. secname:'',
  1068. departSlearder:'',
  1069. departSlearderName:'',
  1070. secLeader:'',
  1071. secLeaderName:'',
  1072. deptTime: '',
  1073. workerId:'',
  1074. workerName:'',
  1075. createTime:'',
  1076. createUser:'',
  1077. secIds: []
  1078. };
  1079. _this.dialogStatusadd = false;
  1080. _this.choleader = false;
  1081. _this.getList(this.params, this.pageSize);
  1082. }
  1083. });
  1084. }
  1085. })
  1086. },
  1087. //功能栏
  1088. iconCli(v) {
  1089. if (v === 1) {
  1090. this.getList(this.params, this.pageSize);
  1091. }
  1092. if (v === 2) {
  1093. this.fullscreen = !this.fullscreen
  1094. }
  1095. },
  1096. //获取自己部门的员工,用于分配处理人。 todo 考虑分配给自己的情况。好麻烦。
  1097. getDepartUsers(o){
  1098. let userInfo=JSON.parse(window.sessionStorage.userInfo)
  1099. console.info('userInfo->',userInfo)
  1100. this.$http({
  1101. url: "/sysmgr/sysuserinfo/queryList",
  1102. method: "post",
  1103. headers: {
  1104. "Content-Type": "application/json",
  1105. },
  1106. data: {
  1107. groupId: userInfo.groupId,
  1108. },
  1109. }).then((ress) => {
  1110. this.teamWorks=ress.data
  1111. console.info('----->teamWorks:',this.teamWorks)
  1112. });
  1113. },
  1114. //gjinfo 相关function ------>
  1115. getGjList(v, n) {
  1116. //根据当前登陆人的角色。刷新查询条件。
  1117. //this.resetRole();
  1118. //gj 当前的pageNum
  1119. this.gjparams.parentId=this.parentId
  1120. this.gjPageSize = n;
  1121. this.$http({
  1122. url: "/market/infotechgjinfo/queryPage",
  1123. method: "post",
  1124. headers: {
  1125. "Content-Type": "application/json",
  1126. "page": '{"pageNo":"' + n + '","pageSize":"10"}'
  1127. },
  1128. data: this.gjparams,
  1129. }).then((res) => {
  1130. this.gjinfoTableData = res.data.data;
  1131. this.gjTotal = res.data.totalRecord;
  1132. });
  1133. },
  1134. //添加稿件
  1135. dialogGjadd(){
  1136. let info = this.gjinfo;
  1137. info.createTime = this.$formatDate(new Date(), "YYYY-MM-DD");
  1138. info.createUser = this.userInfo.loginNo;
  1139. //gjUserName
  1140. //parentId
  1141. //status
  1142. info.parentId=this.parentId
  1143. info.status='0'
  1144. this.teamWorks.map((item) => {
  1145. if(item.loginNoStr==info.gjUserId){
  1146. info.gjUserName=item.loginNameStr
  1147. }
  1148. });
  1149. let _this=this
  1150. let url='/market/infotechgjinfo/add'
  1151. if(this.gjinfo.id){
  1152. url='/market/infotechgjinfo/update'
  1153. }
  1154. console.info('dialogGjadd -> ',info)
  1155. this.$refs.gjinfo.validate(valid => {
  1156. if (valid) {
  1157. this.$http({
  1158. url: url,
  1159. method: "post",
  1160. headers: {
  1161. "Content-Type": "application/json",
  1162. },
  1163. data: info,
  1164. }).then((res) => {
  1165. if (res.data.result === 1) {
  1166. _this.$message({
  1167. message: res.data.desc,
  1168. type: 'error'
  1169. });
  1170. } else {
  1171. _this.$message({
  1172. message: '成功',
  1173. type: 'success'
  1174. });
  1175. _this.closegjdia();
  1176. _this.getGjList(this.gjparams, this.gjPageSize);
  1177. }
  1178. });
  1179. }
  1180. })
  1181. },
  1182. dialogGjdel(row){
  1183. let _this=this
  1184. this.$confirm("确定删除?", "提示", {
  1185. confirmButtonText: "确定",
  1186. cancelButtonText: "取消",
  1187. type: "warning",
  1188. }).then(() => {
  1189. this.$http({
  1190. url: '/market/infotechgjinfo/del',
  1191. method: "post",
  1192. headers: {
  1193. "Content-Type": "application/json",
  1194. },
  1195. data: row,
  1196. }).then((res) => {
  1197. if (res.data.result === 1) {
  1198. _this.$message({
  1199. message: res.data.desc,
  1200. type: 'error'
  1201. });
  1202. } else {
  1203. _this.$message({
  1204. message: '成功',
  1205. type: 'success'
  1206. });
  1207. _this.getGjList(this.gjparams, this.gjPageSize);
  1208. }
  1209. });
  1210. }).catch(() => {});
  1211. },
  1212. downloadzip(gjinfo){
  1213. this.$http({
  1214. url: '/market/techcentergj/zip',
  1215. method: "post",
  1216. responseType: 'blob',
  1217. headers: {
  1218. "Content-Type": "application/json",
  1219. },
  1220. data: gjinfo,
  1221. }).then((response) => {
  1222. if (window.navigator && window.navigator.msSaveOrOpenBlob) {
  1223. let blob = new Blob([response.data], {
  1224. type: response.data.type
  1225. });
  1226. window.navigator.msSaveOrOpenBlob(blob, 'download.zip');
  1227. } else {
  1228. /* 火狐谷歌的文件下载方式 */
  1229. var blob = new Blob([response.data])
  1230. var downloadElement = document.createElement('a')
  1231. var href = window.URL.createObjectURL(blob);
  1232. downloadElement.href = href;
  1233. downloadElement.download = 'download.zip';
  1234. document.body.appendChild(downloadElement);
  1235. downloadElement.click();
  1236. document.body.removeChild(downloadElement);
  1237. window.URL.revokeObjectURL(href);
  1238. }
  1239. });
  1240. },
  1241. handleUploadResult(file){
  1242. console.info('-----------------------------------------------')
  1243. this.gjinfo.files=JSON.stringify(file.files)
  1244. console.info('handleUploadResult',file)
  1245. }
  1246. },
  1247. mounted() {
  1248. this.getList({}, 1);
  1249. },
  1250. created() {
  1251. this.getOpations()
  1252. this.getDepartUsers()
  1253. }
  1254. }
  1255. </script>
  1256. <style scoped lang="scss">
  1257. .onetab {
  1258. margin-bottom: 20px;
  1259. padding: 0 20px;
  1260. }
  1261. .titbox {
  1262. div {
  1263. float: right;
  1264. i {
  1265. font-size: 22px;
  1266. margin-left: 20px;
  1267. cursor: pointer;
  1268. }
  1269. }
  1270. }
  1271. .tabbox {
  1272. margin-top: 15px;
  1273. }
  1274. .pageBox {
  1275. text-align: right;
  1276. margin-top: 10px;
  1277. }
  1278. .info-line {
  1279. width: 100%;
  1280. display: block;
  1281. padding-left: 20px;
  1282. div {
  1283. width: 50%;
  1284. display: inline-block;
  1285. }
  1286. span {
  1287. width: 140px;
  1288. display: inline-block;
  1289. text-align: left;
  1290. i {
  1291. color: red;
  1292. display: inline-block;
  1293. padding-right: 5px;
  1294. }
  1295. }
  1296. .el-select,
  1297. .el-input {
  1298. width: calc(100% - 160px);
  1299. }
  1300. }
  1301. .online {
  1302. width: 100%;
  1303. .el-select {
  1304. width: calc(100% - 160px);
  1305. }
  1306. span {
  1307. vertical-align: top;
  1308. }
  1309. .el-textarea {
  1310. width: calc(100% - 160px);
  1311. }
  1312. .tree {
  1313. width: calc(50% - 60px);
  1314. display: inline-block;
  1315. margin-right: 20px;
  1316. height: 300px;
  1317. overflow-y: scroll;
  1318. .el-icon-error {
  1319. float: right;
  1320. font-size: 20px;
  1321. margin-top: 9px;
  1322. cursor: pointer;
  1323. }
  1324. }
  1325. .treeUser {
  1326. margin: 0;
  1327. border: 1px solid #ddd;
  1328. p {
  1329. background: #f4f4f4;
  1330. padding: 0 20px;
  1331. margin-bottom: 5px;
  1332. }
  1333. }
  1334. .treeUserb {
  1335. width: calc(100% - 100px);
  1336. border: 1px solid #ddd;
  1337. background: #f4f4f4;
  1338. border-radius: 3px;
  1339. height: auto;
  1340. overflow: hidden;
  1341. p {
  1342. display: inline-block;
  1343. padding: 0 20px;
  1344. margin-bottom: 5px;
  1345. }
  1346. }
  1347. }
  1348. .adv-type {
  1349. margin-top: 20px;
  1350. display: flex;
  1351. justify-content: space-between;
  1352. flex-wrap: wrap;
  1353. // border: 1px solid #ddd;
  1354. border-radius: 5px;
  1355. padding: 20px;
  1356. box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
  1357. div {
  1358. width: 33%;
  1359. text-align: center;
  1360. height: 80px;
  1361. overflow: hidden;
  1362. min-width: 100px;
  1363. cursor: pointer;
  1364. padding-top: 10px;
  1365. margin: 10px 0;
  1366. }
  1367. div:hover {
  1368. background: #CFE8FC;
  1369. border-radius: 5px;
  1370. }
  1371. span {
  1372. width: 100%;
  1373. display: inline-block;
  1374. height: 40px;
  1375. // line-height: 40px;
  1376. i {
  1377. color: #0074D9;
  1378. font-size: 36px;
  1379. }
  1380. }
  1381. }
  1382. </style>