detail.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497
  1. <template>
  2. <basicDetails
  3. ref="details"
  4. :titleText="mainData.projectname"
  5. formPath="projectChange"
  6. :editData="mainData"
  7. :mainAreaData="mainAreaData"
  8. :turnPageId="20221020143502"
  9. idname="sa_projectid"
  10. :tags="[]"
  11. :tabs="['详细信息','项目评估','关联客户','联系人','产品配置单','报价单','竞争对手','合同','关联线索']"
  12. @pageChange="pageChange"
  13. @onEditSuccess="queryMainData($route.query.id)">
  14. <!-- 使用此插槽可不传[tags] -->
  15. <!-- <tagPanl slot="tags" :data="tagObj" ownertable="sa_project" :id="mainData.sa_projectid" @onSuccess="queryMainData"/>-->
  16. <div slot="customOperation">
  17. <!-- 此区域提供了自定义操作按钮 -->
  18. <putPeople class="inline-16" @putSuccess="putSuccess" v-if="flagTag !== ''" :rowData="mainData" :flagTag="flagTag" :disabled="mainData.disabled"/>
  19. <recovery class="inline-16" v-if="tool.checkAuth($route.name,'recovery') && mainData.status === '已失败'" :rowData="mainData" :disabled="mainData.disabled" @onRecovery="onSuccess"></recovery>
  20. <finish class="inline-16" v-if="tool.checkAuth($route.name,'finish') && mainData.status === '跟进中'" :disabled="mainData.disabled" @onFinish="onSuccess"></finish>
  21. <Del class="inline-16" :id="mainData.sa_projectid" :nameId="20221020144302" :rowData="mainData" nameKey="sa_projectids" v-if="tool.checkAuth($route.name,'toVoid') " :disabled="mainData.disabled" @deleteSuccess="deleteSuccess"/>
  22. </div>
  23. <template #customBefore>
  24. <div class="flex-align-start normal-panel mt-10 flex-between" style="flex-wrap:nowrap;border-radius: 5px;padding:10px 10px 0 10px">
  25. <div class="flex-align-center-wrap" style="">
  26. <div v-for="item in stageList" :key="item.stagename" >
  27. <div class="stage__panel normal-panel" v-if="item.rowindex === selectRowindex" :style="selectColor">
  28. <div style="transform: skewX(20deg);!important;color: #ffffff">{{item.stagename}}</div>
  29. </div>
  30. <div class="stage__panel normal-panel" v-else :style="unselectColor">
  31. <div style="transform: skewX(20deg);!important;color: #000000" >{{item.stagename}}</div>
  32. </div>
  33. </div>
  34. </div>
  35. <div>
  36. <setStage :stage="stageList" @setStage="setStage" style="margin-bottom: 10px"></setStage>
  37. </div>
  38. </div>
  39. </template>
  40. <div slot="slot0" class=" normal-panel">
  41. <BaseInfo v-if="detailInfo" :detailInfo="detailInfo"/>
  42. </div>
  43. <div slot="slot1" class=" normal-panel">
  44. <StageTask ref="setStage" v-if="mainData" :rowData="mainData"/>
  45. </div>
  46. <div slot="slot2" class=" normal-panel">
  47. <andEnterprise :rowData="mainData" v-if="flag === 1" @changeSuccess="changeSuccess"/>
  48. </div>
  49. <div slot="slot3" class=" normal-panel">
  50. <contacts v-if="mainData" :data="mainData" />
  51. </div>
  52. <div slot="slot4" class=" normal-panel" >
  53. <product_set :data="mainData" v-if="flag === 1" @productSetSuccess="queryMainData($route.query.id)" @delSuccess="queryMainData($route.query.id)"/>
  54. </div>
  55. <div slot="slot5" class="normal-panel" >
  56. <quotation :data="mainData" v-if="flag === 1" />
  57. </div>
  58. <div slot="slot6" class=" normal-panel">
  59. <Rival v-if="mainData" :data="mainData" />
  60. </div>
  61. <div slot="slot7" class=" normal-panel">
  62. <contract v-if="mainData" :data="mainData" />
  63. </div>
  64. <div slot="slot8" class=" normal-panel">
  65. <clue v-if="mainData" :data="mainData" />
  66. </div>
  67. </basicDetails>
  68. </template>
  69. <script>
  70. import Quotation from './modules/quotation/index'
  71. import product_set from './modules/productSet/index'
  72. import Rival from './modules/rival/index'
  73. import BaseInfo from './modules/baseInfo/baseInfo'
  74. import StageTask from './modules/stageTask/index'
  75. import putPeople from '../components/putPeople.vue'
  76. import Check from '../components/check'
  77. import Locked from '../components/Locked'
  78. import Del from '../components/del'
  79. import andEnterprise from './modules/andEnterprise/index'
  80. import clue from './modules/clue/index'
  81. import setStage from '../components/setStage'
  82. import finish from '../components/finish'
  83. import recovery from '../components/recovery'
  84. import contacts from './modules/contacts/index'
  85. import contract from './modules/contract/index'
  86. export default {
  87. components:{
  88. Quotation,
  89. product_set,
  90. Rival,
  91. BaseInfo,
  92. StageTask,
  93. putPeople,
  94. Check,
  95. Locked,
  96. andEnterprise,
  97. Del,
  98. clue,
  99. setStage,
  100. finish,
  101. recovery,
  102. contacts,
  103. contract},
  104. data () {
  105. return {
  106. totalPrice:0,
  107. dialogVisible:false,
  108. disabled:false,
  109. userInfo:JSON.parse(window.sessionStorage.getItem('userInfo')),
  110. nowStage:'',
  111. flagTag:'',
  112. flag:0,
  113. put:{
  114. putFlag:0,
  115. },
  116. mainData: {
  117. disabled:false
  118. },
  119. mainAreaData:'',
  120. /* 企业列表 */
  121. enterpriseList:'',
  122. /* 企业列表 */
  123. projectType:'',
  124. projectLead:'',
  125. projectPanl:'',
  126. projectAddress:'',
  127. detailInfo:'',
  128. tagObj:'',
  129. putPeople:'',
  130. stageList:[],
  131. selectRowindex:'',
  132. selectColor:{
  133. background: '#3874F6'
  134. },
  135. unselectColor:{
  136. background: '#EEEEEE'
  137. },
  138. }
  139. },
  140. watch:{
  141. mainData(val) {
  142. if (this.mainData.leader.length !== 0){
  143. if (JSON.parse(window.sessionStorage.getItem('userInfo')).userid === this.mainData.leader[0].userid){
  144. /*是负责人*/
  145. this.mainData.disabled = true
  146. }else {
  147. /*不是负责人*/
  148. this.mainData.disabled = false
  149. }
  150. }
  151. console.log("权限结果",this.mainData.disabled)
  152. }
  153. },
  154. provide () {
  155. return {
  156. enterpriseList:() => this.enterpriseList,
  157. projectType:() => this.projectType,
  158. projectLead:() => this.projectLead,
  159. projectPanl:() => this.projectPanl,
  160. detailData:() => this.mainData,
  161. projectAddress:() => this.projectAddress
  162. }
  163. },
  164. methods:{
  165. /*修改关联客户*/
  166. changeSuccess(){
  167. this.queryMainData()
  168. this.$refs.details.refreshTag()
  169. },
  170. deleteSuccess(){
  171. /*this.queryMainData(this.$route.query.id)*/
  172. this.$store.dispatch('changeDetailDrawer',false)
  173. },
  174. async queryMainData (id) {
  175. this.totalPrice = 0
  176. const res = await this.$api.requested({
  177. "id": "20221021103902",
  178. "version":1,
  179. "content": {
  180. "sa_projectid":this.$route.query.id
  181. }
  182. })
  183. this.mainData = res.data
  184. this.mainData.discountrate = Math.round((this.mainData.discountrate * 100) * 100)/100
  185. console.log(this.mainData,"项目商机详情");
  186. /* 获取标签数据 */
  187. /*this.tagObj = await this.$store.dispatch('queryTagList',{table:'sa_project',id:this.mainData.sa_projectid})*/
  188. this.flag = 1
  189. this.productSet()
  190. this.getProjectAddres()
  191. this.projectStage()
  192. this.tagData()
  193. },
  194. // 监听切换数据,上一页,下一页
  195. pageChange (id,rowindex) {
  196. this.flag = 0
  197. this.$router.replace({path:'/projectChangeDetail',query:{id:id,rowindex:rowindex}})
  198. this.queryMainData(id)
  199. },
  200. // 获取标签数据
  201. async tagData(){
  202. const res = await this.$api.requested({
  203. content: {
  204. ownertable: "sa_project",
  205. ownerid: this.$route.query.id
  206. },
  207. id: 20220929085401
  208. })
  209. if (res.data.systemtag.length === 0){
  210. this.flagTag = 0
  211. }else {
  212. for (let i=0;i<res.data.systemtag.length;i++){
  213. if (res.data.systemtag[i] === '报备中'){
  214. this.flagTag = 1
  215. break
  216. }else if (res.data.systemtag[i] === '已报备'){
  217. this.flagTag = 2
  218. break
  219. }else {
  220. this.flagTag = 0
  221. }
  222. }
  223. }
  224. this.$refs.details.$refs.tag.queryTag()
  225. this.put.putFlag = this.flagTag
  226. this.mainData = Object.assign({},this.put,this.mainData)
  227. },
  228. /*修改项目阶段*/
  229. async setStage(val){
  230. /*console.log(this.nowStage)*/
  231. const res = await this.$api.requested({
  232. "id": "20221024160102",
  233. "content": {
  234. "sa_projectid":this.mainData.sa_projectid,
  235. "sa_project_stageid":val
  236. }
  237. })
  238. this.tool.showMessage(res,()=>{
  239. this.queryMainData(this.$route.query.id)
  240. this.$refs.setStage.listData(this.$route.query.id)
  241. })
  242. },
  243. /*获取货品选择信息*/
  244. selectionChange(val){
  245. },
  246. /* 获取联系人:负责人列表 */
  247. async getAccount () {
  248. let res = await this.$api.requested({
  249. "id": "20221018150602",
  250. "content": {
  251. "sys_enterpriseid": 1,
  252. "pageNumber": 1,
  253. "pageSize": 20,
  254. "where": {
  255. "condition": ""
  256. }
  257. }
  258. })
  259. },
  260. async getSysetms () {
  261. /* 获取项目类型 */
  262. let res = await this.$store.dispatch('optiontypeselect','projecttype')
  263. this.projectType = res.data
  264. },
  265. /** 获取公司数据 */
  266. async getEnterprise () {
  267. let res = await this.$api.requested({
  268. "id": 20221021095802,
  269. "content": {
  270. "pageNumber": 1,
  271. "pageSize": 99999,
  272. "where": {
  273. "condition": ""
  274. }
  275. },
  276. })
  277. this.enterpriseList = res.data
  278. },
  279. /* 获取项目地址 */
  280. async getProjectAddres () {
  281. let res = await this.$api.requested({
  282. "id": "20221022165503",
  283. "content": {
  284. "sys_enterpriseid": this.mainData.sys_enterpriseid,
  285. "pageNumber": 1,
  286. "pageSize": 999999,
  287. "where": {
  288. "condition": ""
  289. }
  290. }
  291. })
  292. this.projectAddress = res.data
  293. /* 获取项目等级 */
  294. let res2 = await this.$store.dispatch('optiontypeselect','projectgrade')
  295. this.projectLead = res2.data
  296. this.changeDataStructure()
  297. },
  298. changeDataStructure () {
  299. let that = this
  300. this.detailInfo = {
  301. baseInfo: [
  302. {label:'项目编号',value:this.mainData.projectnum ? this.mainData.projectnum : '--'},
  303. {label:'项目名称',value:this.mainData.projectname ? this.mainData.projectname : '--'},
  304. {label:'项目地址',value:`${this.mainData.province} - ${this.mainData.city} - ${this.mainData.county}`},
  305. {label:'详细地址',value:this.mainData.address},
  306. // {label:'项目等级',value:this.projectLead.find(item => item.rowindex == this.mainData.grade).value},
  307. {label: '项目等级',value: this.mainData.grade ? this.mainData.grade : '--'},
  308. {label:'项目类型',value:this.mainData.projecttype ? this.mainData.projecttype : '--'},
  309. {label:'当前项目阶段',value:this.mainData.stagename ? this.mainData.stagename : '--'},
  310. /* {label:'项目联系人',value:this.mainData.contact ? this.mainData.contact : '--'},
  311. {label:'联系人手机号',value:this.mainData.phonenumber ? this.mainData.phonenumber : '--'},*/
  312. {label:'项目规模',value:this.mainData.scale ? this.mainData.scale : '--'},
  313. {label:'项目状态',value:this.mainData.status ? this.mainData.status : '--',
  314. style:function () {
  315. let style = {}
  316. switch (that.mainData.status) {
  317. case '已成交':
  318. style = {color:'#fa8c16'}
  319. break;
  320. case '跟进中':
  321. style = {color:'#52c41a'}
  322. break;
  323. case '已失败':
  324. style = {color:'#999999'}
  325. break;
  326. default:
  327. break;
  328. }
  329. return style
  330. }},
  331. /* {label:'项目折扣',value:this.mainData.discountrate ? this.mainData.discountrate : '--'},*/
  332. {label:'项目预算(万元)',value:this.mainData.budgetary ? this.mainData.budgetary : '--'},
  333. {label:'预计签约金额(元)',value:this.mainData.signamount_due ? this.mainData.signamount_due : '--'},
  334. {label:'预计成交时间',value:this.mainData.signdate_due ? this.mainData.signdate_due : '--'},
  335. {label:'赢率',value:this.mainData.winrate ? this.mainData.winrate : '--'},
  336. {label:'负责人',value:this.mainData.name ? this.mainData.name : '--'},
  337. ],
  338. systemInfo: [
  339. {label:'创建人',value:this.mainData.createby ? this.mainData.createby : '--'},
  340. {label:'创建时间',value:this.mainData.createdate ? this.mainData.createdate : '--'},
  341. {label:'项目报备人',value:this.mainData.reportby?this.mainData.reportby:'--'},
  342. {label:'项目报备时间',value:this.mainData.reportdate?this.mainData.reportdate:'--'},
  343. {label:'报备审核人',value:this.mainData.reportcheckby?this.mainData.reportcheckby:'--'},
  344. {label:'报备审核时间',value:this.mainData.reportcheckdate?this.mainData.reportcheckdate:'--'},
  345. /*{label:'锁定状态',value:this.mainData.locked == '0' ? '锁定' : '解锁'},*/
  346. {label:'最近编辑人',value:this.mainData.changeby ? this.mainData.changeby : '--'},
  347. {label:'最近编辑时间',value:this.mainData.changedate ? this.mainData.changedate : '--'},
  348. {label:'转手次数',value:this.mainData.leader.length !== 0?this.mainData.leader[0].leadernum === 0?'0':this.mainData.leader[0].leadernum:'--'},
  349. ]
  350. }
  351. this.mainAreaData = [
  352. {
  353. label:'项目名称',
  354. value: this.mainData.projectname
  355. },
  356. {
  357. label:'项目编号',
  358. value:this.mainData.projectnum
  359. },
  360. {
  361. label:'项目规模',
  362. value: this.mainData.scale
  363. },
  364. {
  365. label:'项目等级',
  366. /*value: this.projectLead.find(item => item.rowindex == this.mainData.grade).value*/
  367. value: this.mainData.grade
  368. },
  369. {
  370. label:'项目类型',
  371. value:this.mainData.projecttype
  372. },
  373. {
  374. label:'项目阶段',
  375. value: this.mainData.stagename
  376. },
  377. {
  378. label:'项目状态',
  379. value: this.mainData.status,
  380. style: ()=> {
  381. let style = {}
  382. switch (that.mainData.status) {
  383. case '已成交':
  384. style = {color:'#fa8c16'}
  385. break;
  386. case '跟进中':
  387. style = {color:'#52c41a'}
  388. break;
  389. case '已失败':
  390. style = {color:'#999999'}
  391. break;
  392. default:
  393. break;
  394. }
  395. return style
  396. }
  397. },
  398. {
  399. label:'负责人',
  400. value: this.mainData.name
  401. },
  402. {
  403. label:'预计签约金额(元)',
  404. value: this.mainData.signamount_due
  405. },
  406. ]
  407. },
  408. /*获取项目阶段*/
  409. async projectStage(){
  410. const res = await this.$api.requested({
  411. "id": 20221024102402,
  412. "content": {
  413. "sa_projectid":this.mainData.sa_projectid
  414. }
  415. })
  416. this.stageList = res.data
  417. res.data.forEach((e)=>{
  418. if (e.active === 1){
  419. this.selectRowindex = e.rowindex
  420. }
  421. })
  422. },
  423. /*切换阶段*/
  424. changeSelect(val){
  425. this.nowStage = val
  426. this.selectRowindex = val.rowindex
  427. },
  428. /*产品配置单*/
  429. async productSet(){
  430. const res = await this.$api.requested({
  431. "id": 20221021145702,
  432. "content": {
  433. "sa_projectid": this.$route.query.id,
  434. "pageNumber": 1,
  435. "pageSize": 50,
  436. "where": {
  437. "condition": ""
  438. }
  439. },
  440. })
  441. res.data.forEach(e=>{
  442. this.totalPrice = this.totalPrice + e.amount
  443. })
  444. },
  445. /*报备结果*/
  446. putSuccess(val){
  447. this.put.putFlag = val
  448. this.queryMainData(this.$route.query.id)
  449. },
  450. onSuccess(){
  451. this.queryMainData(this.$route.query.id)
  452. }
  453. },
  454. mounted () {
  455. },
  456. async created () {
  457. this.queryMainData(this.$route.query.id)
  458. /*this.getUserInfo()
  459. this.getPutPeople()*/
  460. this.getEnterprise()
  461. this.getSysetms()
  462. // 验证权限
  463. /* this.tool.checkAuth(this.$route.name,'update')?'':this.$router.go(-1)*/
  464. },
  465. }
  466. </script>
  467. <style scoped>
  468. .stage__panel{
  469. padding: 0px 10px 0px 10px ;
  470. height: 32px;
  471. line-height: 32px;
  472. min-width:85px;
  473. border-radius: 2px;
  474. transform: skewX(-20deg);
  475. margin-left:15px;
  476. margin-bottom: 10px;
  477. text-align: center;
  478. cursor: pointer;
  479. background: #EEEEEE;
  480. }
  481. .stage__panel > div {
  482. transform: skewX(45deg);
  483. }
  484. </style>