remark_detail.html 68 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>标注中心</title>
  6. <script src="/bower_components/jquery/dist/jquery.min.js"></script>
  7. <link href="/dist/css/normalize.min.css" rel="stylesheet">
  8. <link href="/dist/css/animate.min.css" rel="stylesheet">
  9. <link rel="stylesheet" href="/dist/css/zz.css">
  10. <link rel="stylesheet" href="/dist/css/index.css">
  11. <script src="/dist/js/vue.min.js"></script>
  12. <script src="/dist/js/index.js"></script>
  13. <style>
  14. .add-tip {
  15. width: 24px;
  16. height: 22px;
  17. line-height: 22px;
  18. text-align: center;
  19. color: #fff;
  20. margin: 0;
  21. padding: 0;
  22. border: 1px solid #ccc;
  23. background-color: #fdfdfd;
  24. }
  25. .info-box > * {
  26. cursor: pointer;
  27. }
  28. .button-group {
  29. display: flex;
  30. flex-direction: row;
  31. align-items: center;
  32. justify-content: space-between;
  33. }
  34. .button-group .info-box {
  35. margin-left: -60px;
  36. }
  37. .edit-box .edit.two .edit-title {
  38. padding-right: 4px;
  39. }
  40. .edit-box .edit .edit-input .label > span {
  41. max-width: unset;
  42. text-align: left;
  43. padding: 0 1em;
  44. }
  45. .a-button {
  46. color: #4169e3;
  47. margin: 8px 15px;
  48. padding: 4px 10px;
  49. }
  50. .button-box.delete-box {
  51. margin-right: 22px !important;
  52. margin-left: -419px !important;
  53. }
  54. .button-box.delete-box .pass {
  55. background-color: #f56c6c !important;
  56. }
  57. .pass.success {
  58. background-color: #09bb07 !important;
  59. }
  60. .pass.default {
  61. background-color: #adadad !important;
  62. }
  63. .el-table td, .el-table th {
  64. padding: 4px 0;
  65. }
  66. .top-button-group {
  67. margin-top: 20px;
  68. }
  69. .top-button-group button {
  70. margin-bottom: 12px;
  71. }
  72. .el-radio-button--mini.info .el-radio-button__inner {
  73. color: #909399 !important;
  74. background: #f4f4f5 !important;
  75. border-color: #d3d4d6 !important;
  76. }
  77. .default .el-radio-button__orig-radio + .el-radio-button__inner {
  78. color: #409eff;
  79. background: #ecf5ff;
  80. border-color: #b3d8ff;
  81. }
  82. .success .el-radio-button__orig-radio + .el-radio-button__inner {
  83. color: #67c23a;
  84. background: #f0f9eb;
  85. border-color: #c2e7b0;
  86. }
  87. .success .el-radio-button__orig-radio:checked + .el-radio-button__inner,
  88. .default .el-radio-button__orig-radio:checked + .el-radio-button__inner {
  89. color: #FFF;
  90. background-color: #409EFF;
  91. border-color: #409EFF;
  92. -webkit-box-shadow: -1px 0 0 0 #409EFF;
  93. box-shadow: -1px 0 0 0 #409EFF
  94. }
  95. </style>
  96. <script>
  97. function prettyPrint(obj) {
  98. var ENDLINE = "\n";
  99. var COMMA_ENDLINE = ",\n";
  100. var OBJ_BEGIN = "{";
  101. var OBJ_END = "}";
  102. var ARR_BEGIN = "[";
  103. var ARR_END = "]";
  104. var INDNET_SPACES = 4;
  105. return (function innerPrettyPrint(obj, spaces) {
  106. var type = typeof obj;
  107. if (type == "number" || type == "boolean") {
  108. return obj.toString();
  109. } else if (type == "string") {
  110. if (obj != "" && !isNaN(Number(obj))) {
  111. return Number(obj)
  112. }
  113. return '"' + obj + '"';
  114. } else {
  115. var entries = [];
  116. var thisIndent = ' '.repeat(spaces);
  117. var subIndent = thisIndent + ' '.repeat(INDNET_SPACES);
  118. var subSpaces = spaces + INDNET_SPACES;
  119. if (Object.prototype.toString.call(obj) == '[object Object]') {
  120. for (var k in obj) {
  121. entries.push('"' + k + '": ' + innerPrettyPrint(obj[k], subSpaces));
  122. }
  123. return OBJ_BEGIN + ENDLINE + subIndent + entries.join(COMMA_ENDLINE + subIndent) + ENDLINE + thisIndent + OBJ_END;
  124. } else if (Object.prototype.toString.call(obj) == '[object Array]') {
  125. obj.forEach(function (a) {
  126. entries.push(innerPrettyPrint(a, subSpaces));
  127. });
  128. return ARR_BEGIN + ENDLINE + subIndent + entries.join(COMMA_ENDLINE + subIndent) + ENDLINE + thisIndent + ARR_END;
  129. } else if (obj === null) {
  130. return "null";
  131. } else {
  132. return obj.toString();
  133. }
  134. }
  135. })(obj, 0);
  136. }
  137. </script>
  138. </head>
  139. <body>
  140. <main id="app">
  141. <div class="content" :class="{mm:showPop}">
  142. <!--文章区-->
  143. <div class="article">
  144. <div class="top-button-group">
  145. <el-radio-group v-model="activeLabel" size="mini">
  146. <el-radio-button class="default" label="原文"></el-radio-button>
  147. {{if .T.info.filetext}}
  148. <el-radio-button class="default" label="附件"></el-radio-button>
  149. {{end}}
  150. </el-radio-group>
  151. <el-radio-group v-model="activeLabel" v-for="(item, index) in otherInfo" size="mini">
  152. <el-radio-button class="success" :label="item.id">[[item.subtype]]</el-radio-button>
  153. <el-radio-button class="success" :label="item.id + '-附件'">附件</el-radio-button>
  154. </el-radio-group>
  155. <el-radio-group v-if="moreInfo&&moreInfo.length > 0" size="mini">
  156. <el-popover
  157. placement="right-end"
  158. trigger="hover">
  159. <el-table :data="moreInfo" max-height="300">
  160. <el-table-column width="50" property="subtype" label="类型"></el-table-column>
  161. <el-table-column width="180" property="publishtime" label="发布日期"></el-table-column>
  162. <el-table-column width="220" property="title" label="标题">
  163. <template slot-scope="scope">
  164. <a href="#" @click="openLink(scope.row.href)">[[scope.row.title]]</a>
  165. </template>
  166. </el-table-column>
  167. </el-table>
  168. <el-radio-button class="info" slot="reference" style="border-color: #d3d4d6;">更多
  169. </el-radio-button>
  170. </el-popover>
  171. </el-radio-group>
  172. </div>
  173. <hr style="border: 1px;" width="100%">
  174. <br><a v-if="getPageInfo.href.length > 0" :href="getPageInfo.href" target="_blank">查看原文</a>
  175. <!--<a href="{{.T.jyhref}}" target="_blank">剑鱼链接</a>-->
  176. <h3>[[getPageInfo.title]]</h3><br>
  177. <div v-html="pageHtml"></div>
  178. </div>
  179. <!--操作区-->
  180. <div class="operation">
  181. <!--edit-box-->
  182. <div class="edit-box">
  183. <!--edit-->
  184. <div class="edit one" v-for="(one,oindex) in editData" :key="oindex">
  185. <!--one-->
  186. <div class="edit-title" @click="one.show = !one.show">
  187. <span>[[one.title]]</span>
  188. <div class="button-group">
  189. <div v-if="one.showCheck">
  190. <input :id="one.title" v-show="one.title == '标的信息'" @click.stop type="checkbox"
  191. v-model="one.checkAllTag">
  192. <label @click.stop v-show="one.title == '标的信息'" :for="one.title">全部标注</label>
  193. </div>
  194. <!-- &nbsp;
  195. <div v-if="one.showCheck">
  196. <input :id="one.title" @click.stop type="checkbox" v-model="one.checkType">
  197. <label @click.stop :for="one.title">是否抽取</label>
  198. </div>-->
  199. <div class="button-box">
  200. <!--v-show="one.title == '基本字段'"-->
  201. <button class="pass success" @click.stop="saveDataOne(one,'1')"
  202. style="font-size: 14px;width: auto;float:left;">通过
  203. </button>
  204. <button class="pass default" @click.stop="saveDataOne(one,'-1')"
  205. style="font-size: 14px;width: auto;float:left">取消
  206. </button>
  207. <!-- <button class="pass" @click.stop="open(one, true)" style="font-size: 14px;width: auto;float:left">保存</button>-->
  208. </div>
  209. <!--<button class="add" v-show="one.title != '基本'" @click.stop="one.content.push(getTemp(2));goMark2(500)">+</button>-->
  210. <!--<button class="add" v-show="one.title == '基本'" @click.stop="one.content[0].content.push(getTemp(3));goMark2(60)">+</button>-->
  211. <div class="info-box" @click.stop v-show="one.showCheck">
  212. <div :class="{default: one.status == '-1'}" @click="setStatus(one,'-1')"></div>
  213. <!--<div :class="{ok: one.status == '1'}" @click="one.status = '1'"></div>-->
  214. <div :class="{ok: one.status == '1'}" @click="setStatus(one,'1')"></div>
  215. <!--<div :class="{err: one.status == '0'}" @click="one.status = '0'"></div>-->
  216. <div class="add-tip" :class="{err: (one.status != '1' && one.status != '-1')}"
  217. @click="setStatus(one,'2')"></div>
  218. </div>
  219. </div>
  220. </div>
  221. <transition tag="div">
  222. <div>
  223. <div class="button-box" v-if="one.showCheck&&one.show">
  224. <button class="pass a-button" @click.stop="addChild(one, oindex)"
  225. style="font-size: 14px;width: auto;float:left;">新增[[one.title]]
  226. </button>
  227. </div>
  228. <div class="edit-content" :class="{t:one.title == '基本字段'}" v-show="one.show">
  229. <!--two-->
  230. <span v-show="one.content.length === 0">当前您还没有添加子包</span>
  231. <div class="edit two" v-for="(two,index) in one.content" :key="index">
  232. <div class="edit-title" v-if="two.title" @click="two.show = !two.show">
  233. <span>[[two.title]]</span>
  234. <div class="button-box"
  235. :style="one.title == '多包信息' ? 'margin-right: 193px' : ''">
  236. <button v-if="one.title == '多包信息'" class="pass a-button"
  237. @click.stop="addThreeChild(two,'2',one)"
  238. style="font-size: 14px;margin: 0;width: auto;float:left;">新增子包中标信息
  239. </button>
  240. <button class="pass success" @click.stop="saveDataTwo(two,'1',one)"
  241. style="font-size: 14px;width: auto;float:left;">通过
  242. </button>
  243. <button class="pass default" @click.stop="saveDataTwo(two,'-1',one)"
  244. style="font-size: 14px;width: auto;float:left">取消
  245. </button>
  246. </div>
  247. <div class="button-box delete-box">
  248. <button class="pass" @click.stop="delNewTwo(one, index, two)">删除</button>
  249. </div>
  250. </div>
  251. <transition tag="div">
  252. <div class="edit-content" v-show="two.show">
  253. <!--input-->
  254. <div class="edit-input">
  255. <div v-for="(uin, uindex) of two.uInput" class="input-box"
  256. :key="uin.title">
  257. <div class="label" v-if="uin.selectArr">
  258. <span>[[uin.title]]&nbsp;:&nbsp;</span>
  259. <select v-model="uin.select"
  260. @change="focusFn(uin, oindex,index,uindex, two, one)">
  261. <option disabled value="">请选择</option>
  262. <option v-for="o in uin.selectArr">[[o]]</option>
  263. </select>
  264. <div class="info-box">
  265. <div :class="{default: uin.status == '-1'}"
  266. @click="setStatus(uin,'-1', two, one)"></div>
  267. <div :class="{ok: uin.status == '1'}"
  268. @click="setStatus(uin,'1', two, one)"></div>
  269. <!--<div :class="{err: uin.status == '0'}" @click="uin.status = '0'"></div>-->
  270. <div class="add-tip" @click="setStatus(uin,'2', two, one)"
  271. :class="{err: (uin.status != '1' && uin.status != '-1')}"></div>
  272. </div>
  273. </div>
  274. <div class="label" v-else :title="uin.input">
  275. <span @click="goText(uin.title)">[[uin.title]]&nbsp;:&nbsp;</span>
  276. <input type="text" v-model="uin.input"
  277. @focus="goText(uin.input)" @click="goText(uin.input)"
  278. @blur="focusFn(uin, oindex, index, uindex,two,one)">
  279. <div class="info-box">
  280. <div :class="{default: uin.status == '-1'}"
  281. @click="setStatus(uin,'-1', two, one)"></div>
  282. <div :class="{ok: uin.status == '1'}"
  283. @click="setStatus(uin,'1', two, one)"></div>
  284. <!--<div :class="{err: uin.status == '0'}" @click="uin.status = '0'"></div>-->
  285. <div class="add-tip" @click="setStatus(uin,'2', two, one)"
  286. :class="{err: (uin.status != '1' && uin.status != '-1')}"></div>
  287. </div>
  288. </div>
  289. </div>
  290. </div>
  291. <!--three-->
  292. <!--<div>
  293. <div class="edit-title" v-show="one.title == '基本字段'">
  294. <span>候选人</span>
  295. <div class="info-box" >
  296. <div :class="{default: two.wstatus == '-1'}" @click="two.wstatus = '-1'"></div>
  297. <div :class="{ok: two.wstatus == '1'}" @click="two.wstatus = '1'"></div>
  298. <el-popover trigger="click" >
  299. <div style="text-align: right; margin: 0">
  300. <el-button type="success" size="mini" @click="two.wstatus = '2'">新增</el-button>
  301. <el-button type="warning" size="mini" @click="two.wstatus = '3'">修改</el-button>
  302. <el-button type="danger" size="mini" @click="two.wstatus = '4'">删除</el-button>
  303. </div>
  304. <div class="add-tip" slot="reference" :class="{err: (two.wstatus != '1' && two.wstatus != '-1')}">[[textMap[two.wstatus] || '']]</div>
  305. </el-popover>
  306. </div>
  307. </div>
  308. <div class="edit three" v-for="(three,index) in two.content" :key="index">
  309. <div class="edit-title" @click="three.show = !three.show">
  310. <span>[[three.title]]</span>
  311. </div>
  312. <div class="edit-content" v-show="three.show">
  313. <div class="edit-input">
  314. <div class="input-box" v-for="(threeUin,index) in three.uInput" :key="threeUin.title">
  315. <div class="label">
  316. <span @click="goText(threeUin.title)">[[threeUin.title]]&nbsp;:&nbsp;</span>
  317. <input type="text" v-model="threeUin.input" @focus="goText(threeUin.input)" @click="goText(threeUin.input)">
  318. <div class="info-box">
  319. <div :class="{default: threeUin.status == '-1'}" @click="threeUin.status = '-1'"></div>
  320. <div :class="{ok: threeUin.status == '1'}" @click="threeUin.status = '1'"></div>
  321. <el-popover trigger="click" >
  322. <div style="text-align: right; margin: 0">
  323. <el-button type="success" size="mini" @click="threeUin.status = '2'">新增</el-button>
  324. <el-button type="warning" size="mini" @click="threeUin.status = '3'">修改</el-button>
  325. <el-button type="danger" size="mini" @click="threeUin.status = '4'">删除</el-button>
  326. </div>
  327. <div class="add-tip" slot="reference" :class="{err: (threeUin.status != '1' && threeUin.status != '-1')}">[[textMap[threeUin.status] || '']]</div>
  328. </el-popover>
  329. </div>
  330. </div>
  331. </div>
  332. </div>
  333. </div>
  334. </div>
  335. </div>-->
  336. </div>
  337. </transition>
  338. </div>
  339. </div>
  340. </div>
  341. </transition>
  342. </div>
  343. </div>
  344. <div class="save-box">
  345. <button class="code" @click.stop="showPop = true" style="width:100px">源码</button>&nbsp;&nbsp;
  346. <!-- <button class="code" @click.stop="open(1)" style="width:100px">全部验证</button> -->
  347. <button class="code" @click.stop="open(2)" style="width:100px">字段验证</button>
  348. <!-- <button class="code" @click.stop="open('', false)" style="width:100px">保存</button>&nbsp;&nbsp;-->
  349. <button class="code" @click.stop="openHref" style="width:100px">下一条</button>
  350. <!--<button class="code" @click.stop="window.location.href='/'" style="width:100px">下一条</button>-->
  351. </div>
  352. </div>
  353. </div>
  354. <!--弹出层-->
  355. <dialog class="dialog" v-if="showPop">
  356. <span class="close" @click="showPop = false;changeText()">x</span>
  357. <div class="pop">
  358. <div class="title">源码</div>
  359. <div class="con" ref="text" contentEditable="true">
  360. <pre v-html="addStyle(editData)"></pre>
  361. </div>
  362. <button @click="showPop = false;changeText();upChange()">保&nbsp;存</button>
  363. </div>
  364. </dialog>
  365. <dialog id="com-alert" class="dialog" style="background: rgba(124, 124, 125, 0.1);z-index:9999;display: none;">
  366. <div class="pop" style="background: rgba(124, 124, 125, 0.1);">
  367. <div id="com-alert-val" class="title" style="color:red">保存成功</div>
  368. </div>
  369. </dialog>
  370. </main>
  371. </body>
  372. <script>
  373. let tid = {{ .T.tid }}
  374. let did = {{ .T.did }}
  375. var allCheckFields = {{ .T.fields }} //本次需标注的所有字段
  376. var moreInfo = {{ .T.moreInfo }} // 更多关联信息
  377. var otherInfo = {{ .T.otherInfo }} //公告关联信息
  378. let purchasing_status = {{ .T.ck_purchasinglist }} //标的物标记
  379. let purchasing_all_tag = {{ .T.ck_pclistag }} // 标的物是否全部标记
  380. let package_status = {{ .T.ck_package }} //包标记
  381. let winneroder_status = {{ .T.ck_winnerorder }} //中标候选人标记
  382. // 页面数据
  383. var pageDataMap = {
  384. '原文': {
  385. title: '{{.T.info.title}}',
  386. href: '{{.T.info.href}}',
  387. // html: '{{Html (Regexp (Regexp .T.info.detail "(\\n|\\\\n)\\s+" "\n") "(`|\\n|\\\\n)+" "<br/>")}}',
  388. html: '{{ .T.info.detail }}',
  389. },
  390. '附件': {
  391. title: '附件内容',
  392. href: '',
  393. // html:{{if .T.info.filetext}}{{.T.info.filetext}}.replace(/(\\n|\\\\n)\\s+/, '\n').replace(/(`|\\n|\\\\n)+/, '<br>'){{else}}``{{end}} }
  394. html: '{{ .T.info.filetext }}',
  395. },
  396. }
  397. //快捷键
  398. $(document).keydown(function (event) {
  399. if (!event.shiftKey) {
  400. var text = getSelectedContents();//获取选中文本
  401. if (!text.trim().length) {
  402. return
  403. }
  404. }
  405. if (event.keyCode === 82) {//项目名称快捷键r
  406. if (event.shiftKey) {
  407. app.changeBaseValue(0, '', 2) //删除对应文本
  408. } else {
  409. app.changeBaseValue(0, text, 2)//填充
  410. }
  411. } else if (event.keyCode === 81) {//省份快捷键q
  412. if (event.shiftKey) {
  413. app.changeBaseValue(1, '', 2) //删除对应文本
  414. } else {
  415. app.changeBaseValue(1, text, 2)//填充
  416. }
  417. } else if (event.keyCode === 84) {//项目编号快捷键t
  418. if (event.shiftKey) {
  419. app.changeBaseValue(2, '', 2) //删除对应文本
  420. } else {
  421. app.changeBaseValue(2, text, 2)//填充
  422. }
  423. } else if (event.keyCode === 87) {//城市快捷键w
  424. if (event.shiftKey) {
  425. app.changeBaseValue(3, '', 2) //删除对应文本
  426. } else {
  427. app.changeBaseValue(3, text, 2)//填充
  428. }
  429. } else if (event.keyCode === 69) {//区县快捷键e
  430. if (event.shiftKey) {
  431. app.changeBaseValue(5, '', 2) //删除对应文本
  432. } else {
  433. app.changeBaseValue(5, text, 2)//填充
  434. }
  435. } else if (event.keyCode === 65) {//预算快捷键a
  436. if (event.shiftKey) {
  437. app.changeBaseValue(6, '', 2) //删除对应文本
  438. } else {
  439. app.changeBaseValue(6, text, 2)//填充
  440. }
  441. } else if (event.keyCode === 90) {//中标金额快捷键z
  442. if (event.shiftKey) {
  443. app.changeBaseValue(7, '', 2) //删除对应文本
  444. } else {
  445. app.changeBaseValue(7, text, 2)//填充
  446. }
  447. } else if (event.keyCode === 83) {//采购单位快捷键s
  448. if (event.shiftKey) {
  449. app.changeBaseValue(8, '', 2) //删除对应文本
  450. } else {
  451. app.changeBaseValue(8, text, 2)//填充
  452. }
  453. } else if (event.keyCode === 88) {//代理机构快捷键x
  454. if (event.shiftKey) {
  455. app.changeBaseValue(9, '', 2) //删除对应文本
  456. } else {
  457. app.changeBaseValue(9, text, 2)//填充
  458. }
  459. } else if (event.keyCode === 68) {//中标单位快捷键d
  460. if (event.shiftKey) {
  461. app.changeBaseValue(10, '', 2) //删除对应文本
  462. } else {
  463. app.changeBaseValue(10, text, 2)//填充
  464. }
  465. }
  466. });
  467. //获取鼠标选中的文本
  468. function getSelectedContents() {
  469. var text = "";
  470. if (window.getSelection) { //chrome,firefox,opera
  471. var range = window.getSelection().getRangeAt(0);
  472. var container = document.createElement('div');
  473. container.appendChild(range.cloneContents());
  474. text = container.innerHTML;
  475. //return container.innerHTML;
  476. //return window.getSelection(); //只复制文本
  477. } else if (document.getSelection) { //其他
  478. var range = document.getSelection().getRangeAt(0);
  479. var container = document.createElement('div');
  480. container.appendChild(range.cloneContents());
  481. text = container.innerHTML;
  482. //return container.innerHTML;
  483. //return document.getSelection(); //只复制文本
  484. } else if (document.selection) { //IE特有的
  485. text = document.selection.createRange().htmlText;
  486. //return document.selection.createRange().htmlText;
  487. //return document.selection.createRange().text; //只复制文本
  488. }
  489. text = text.replace(/(\r|\n|\s+|&nbsp;|<[^>]*>|<\/[^>]*)/g, "")
  490. return text;
  491. }
  492. //记录是否点击保存
  493. var issave = false;
  494. var _id = {{ .T.did }}
  495. var nextid = {{ .T.nextid }}
  496. //基本信息
  497. var common = {{ .T.common }}
  498. var uInput = [];
  499. for (k in common) {
  500. var tmp = {}
  501. tmp.title = common[k].descript
  502. tmp.input = common[k].value
  503. tmp.key = common[k].key
  504. if (common[k].key === "subtype") {
  505. tmp.select = common[k].value
  506. tmp.selectArr = {{ .T.topsubtype }}
  507. }
  508. if (common[k].key === "attach_discern") {
  509. tmp.select = common[k].value
  510. tmp.selectArr = ['识别有效', '识别无效']
  511. }
  512. if (common[k].key === "attach_ext") {
  513. tmp.select = common[k].value
  514. tmp.selectArr = ['抽取正确', '抽取错误']
  515. }
  516. if (common[k].key === "isrepeat") {
  517. tmp.select = common[k].value
  518. tmp.selectArr = ['是', '否']
  519. }
  520. tmp.status = common[k].status
  521. if (common[k].key === "bidamounttype") {
  522. tmp.select = common[k].value ? common[k].value : '金额'
  523. tmp.selectArr = ['金额', '折扣率', '单价']
  524. tmp.status = 1
  525. }
  526. uInput[k] = tmp
  527. }
  528. //时间地点
  529. var timeplace = {{ .T.timeplace }}
  530. var tpInput = [];
  531. for (k in timeplace) {
  532. var tmp = {}
  533. tmp.title = timeplace[k].descript
  534. tmp.input = timeplace[k].value
  535. tmp.key = timeplace[k].key
  536. tmp.status = timeplace[k].status
  537. tpInput[k] = tmp
  538. }
  539. //其他信息
  540. var other = {{ .T.other }}
  541. var otherInput = [];
  542. for (k in other) {
  543. var tmp = {}
  544. tmp.title = other[k].descript
  545. tmp.input = other[k].value
  546. tmp.key = other[k].key
  547. tmp.status = other[k].status
  548. if (other[k].key === "isppp" || other[k].key === "contract_guarantee" || other[k].key === "bid_guarantee") {
  549. tmp.select = other[k].value
  550. tmp.selectArr = ['是', '否']
  551. }
  552. otherInput[k] = tmp
  553. }
  554. //中标候选人
  555. var c_worder = {{ .T.worder }}
  556. var worder_new = {{ .T.worder_new }}
  557. var c_content = [];
  558. for (k in c_worder) {
  559. var c_uInput = [];
  560. for (i in c_worder[k]) {
  561. var tmp = {}
  562. tmp.title = c_worder[k][i].descript
  563. tmp.input = c_worder[k][i].value || ''
  564. tmp.key = c_worder[k][i].key
  565. tmp.status = c_worder[k][i].status
  566. c_uInput[i] = tmp
  567. }
  568. var content = {};
  569. content.title = "候选人"
  570. content.show = true
  571. content.status = worder_new[k]["status"]
  572. content.uInput = c_uInput
  573. content.isnew = worder_new[k]["isnew"] || false
  574. content.content = []
  575. c_content[k] = content
  576. }
  577. //标的信息
  578. var purchasinglist = {{ .T.purchasinglist }}
  579. var pcl_new = {{ .T.pcl_new }}
  580. var pcl_content = [];
  581. for (k in purchasinglist) {
  582. var c_uInput = [];
  583. for (i in purchasinglist[k]) {
  584. var tmp = {}
  585. tmp.title = purchasinglist[k][i].descript
  586. tmp.input = purchasinglist[k][i].value
  587. tmp.key = purchasinglist[k][i].key
  588. tmp.status = purchasinglist[k][i].status
  589. //if(purchasinglist[k][i].key== "pclisover"){
  590. // tmp.select = purchasinglist[k][i].value ? purchasinglist[k][i].value : '是'
  591. // //tmp.select=purchasinglist[k][i].value
  592. // tmp.selectArr=['是','否']
  593. //}
  594. c_uInput[i] = tmp
  595. }
  596. var content = {};
  597. content.title = "标的物"
  598. content.show = true
  599. content.status = pcl_new[k]["status"]
  600. content.uInput = c_uInput
  601. content.isnew = pcl_new[k]["isnew"] || false
  602. content.content = []
  603. pcl_content[k] = content
  604. }
  605. //var ispackage='{{.T.ispackage}}'
  606. //子包信息
  607. var packs = {{ .T.packs }}
  608. var packskey = {{ .T.packskey }}
  609. var pkg_new = {{ .T.pkg_new }}
  610. //分包抽查,若果有分包,默认ok
  611. //if(packs.length>0&&ispackage=="1"){
  612. // ck_package="1"
  613. //}
  614. var p_content = [];
  615. for (k in packs) {
  616. //子包基本信息
  617. var uInputs = [];
  618. var pack = packs[k]["pack"]
  619. for (i in pack) {
  620. var tmp = {}
  621. tmp.title = pack[i].descript
  622. tmp.input = pack[i].value
  623. tmp.key = pack[i].key
  624. tmp.status = pack[i].status
  625. if (pack[i].key === "bidamounttype") {
  626. tmp.select = pack[i].value ? pack[i].value : '金额'
  627. tmp.selectArr = ['金额', '折扣率', '单价']
  628. tmp.status = 1
  629. }
  630. uInputs[i] = tmp
  631. }
  632. //中标人信息
  633. var winnerall = packs[k]["winnerall"]
  634. for (i in winnerall) {
  635. var tmp = {}
  636. tmp.title = winnerall[i].descript
  637. tmp.input = winnerall[i].value
  638. tmp.key = winnerall[i].key
  639. tmp.status = winnerall[i].status
  640. uInputs.push(tmp)
  641. }
  642. var content = {};
  643. content.title = "子包";
  644. content.show = true;
  645. content.status = packs[k]["packstatus"];
  646. content.uInput = uInputs;
  647. content.isnew = pkg_new[k] || false
  648. content.num = packskey[k];
  649. p_content[k] = content;
  650. }
  651. var pclf = {{ .T.PurchasinglistField }}
  652. var pclfInput = []
  653. for (i in pclf) {
  654. for (key in pclf[i]) {
  655. var tempNode = {
  656. input: "",
  657. key: key,
  658. status: "2",
  659. title: pclf[i][key]
  660. }
  661. //if(key== "pclisover"){
  662. // tempNode.select= '是'
  663. // tempNode.selectArr=['是','否']
  664. //}
  665. pclfInput.push(tempNode)
  666. }
  667. }
  668. var wodf = {{ .T.WinnerorderField }}
  669. var wodfInput = []
  670. for (i in wodf) {
  671. for (key in wodf[i]) {
  672. wodfInput.push({
  673. input: "",
  674. key: key,
  675. status: "2",
  676. title: wodf[i][key]
  677. })
  678. }
  679. }
  680. var pf = {{ .T.PackageField }}
  681. var pfInput = []
  682. for (i in pf) {
  683. for (key in pf[i]) {
  684. var tempNode = {
  685. input: "",
  686. key: key,
  687. status: "2",
  688. title: pf[i][key]
  689. }
  690. if (key === "bidamounttype") {
  691. tempNode.select = '金额'
  692. tempNode.selectArr = ['金额', '折扣率', '单价']
  693. }
  694. pfInput.push(tempNode)
  695. }
  696. }
  697. var app = new Vue({
  698. el: '#app',
  699. delimiters: ["[[", "]]"],
  700. data: {
  701. activeLabel: '原文',
  702. nowLabel: ['原文'],
  703. otherInfo: otherInfo,
  704. moreInfo: moreInfo,
  705. scrollCache: {
  706. value: '',
  707. index: 0
  708. },
  709. textMap: ['', '', '增', '改', '删'],
  710. // pageHtml: `{{Html (Regexp (Regexp .T.info.detail "(\\n|\\\\n)\\s+" "\n") "(`|\\n|\\\\n)+" "<br/>")}}`,
  711. pageHtml: '{{ .T.info.detail }}',
  712. showPop: false,
  713. editData:[{
  714. title: '基本字段',
  715. show: true,
  716. status: "1",
  717. content: [{
  718. title: '',
  719. show: true,
  720. delete: false,
  721. //wstatus:"-1",
  722. uInput: uInput
  723. //content: c_content
  724. }]
  725. }, {
  726. title: '时间地点',
  727. show: false,
  728. status: "1",
  729. content: [{
  730. title: '',
  731. show: true,
  732. delete: false,
  733. //wstatus:"-1",
  734. uInput: tpInput
  735. }]
  736. }, {
  737. title: '标的信息',
  738. show: false,
  739. showCheck: true,
  740. key: 'purchasinglist',
  741. //checkType: {{.T.ck_pclisext}},
  742. checkAllTag: purchasing_all_tag,
  743. status: purchasing_status,
  744. content: pcl_content
  745. }, {
  746. title: '多包信息',
  747. show:false,
  748. showCheck: true,
  749. key: 'package',
  750. // checkType: {{.T.ck_pkgisext}},
  751. status: package_status,
  752. content: p_content
  753. }, {
  754. title: '中标候选人信息',
  755. show: false,
  756. showCheck: true,
  757. key: 'winnerorder',
  758. // checkType: {{.T.ck_wodrisext}},
  759. status: winneroder_status,
  760. content: c_content
  761. }, {
  762. title: '其余信息',
  763. show:false,
  764. status:"1",
  765. content:[{
  766. title: '',
  767. show: true,
  768. delete: false,
  769. //wstatus:"-1",
  770. uInput: otherInput
  771. }]
  772. }],
  773. originData: []},
  774. watch: {
  775. //切换标签时更改正文内容
  776. 'activeLabel':
  777. function () {
  778. this.pageHtml = this.getPageInfo.html
  779. }},
  780. computed: {
  781. getPageInfo() {
  782. var tempData = {
  783. title: '',
  784. html: this.pageHtml,
  785. href: ''
  786. }
  787. //匹配原文或者原文附件
  788. var originData = pageDataMap[this.activeLabel]
  789. if (originData) {
  790. tempData.title = originData.title
  791. tempData.html = originData.html
  792. tempData.href = originData.href
  793. } else {//匹配原公告关联信息
  794. var tempS = this.activeLabel.split('-')
  795. var isFile = tempS.length === 2
  796. var otherData = this.otherInfo.filter(v => v.id == tempS[0])
  797. if (otherData.length > 0) {
  798. tempData.title = otherData[0].title
  799. tempData.html = otherData[0].detail
  800. tempData.href = otherData[0].href
  801. if (isFile) {
  802. tempData.title = '附件内容'
  803. tempData.html = otherData[0].filetext
  804. tempData.href = ''
  805. }
  806. }
  807. }
  808. return tempData
  809. }
  810. },
  811. mounted() {
  812. // 缓存原始数据
  813. this.originData = JSON.parse(JSON.stringify([].concat(this.editData)))
  814. },
  815. methods: {
  816. // 当前输入框数据与原始数据比较
  817. focusFn(uin, oIndex, tIndex, uIndex, two, one) {
  818. if (uin.key === "bidendtime" || uin.key === "bidopentime" || uin.key === "project_startdate" || uin.key === "project_completedate" ||
  819. uin.key === "publishtime" || uin.key === "signaturedate") {
  820. var val = uin.input
  821. if (val !== "") {
  822. var reg = /^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$/;
  823. var regExp = new RegExp(reg);
  824. if (!regExp.test(val)) {
  825. this.$message({
  826. message: uin.title + ",日期格式错误!正确格式:2006-01-02 15:04:05",
  827. type: 'warning',
  828. duration: 2000,
  829. offset: 300
  830. });
  831. return
  832. }
  833. }
  834. }
  835. var newNode = this.originData[oIndex].content[tIndex]
  836. if (newNode == null) {//新增子模块处理
  837. return
  838. }
  839. var oNode = newNode.uInput[uIndex]
  840. if (oNode == null) {//新增中标人信息处理
  841. return
  842. }
  843. var changeStatus = uin.input === oNode.input//多包中新增的中标信息报错
  844. if (uin.select) {
  845. changeStatus = uin.select === oNode.select
  846. }
  847. uin.status = changeStatus ? 1 : 2
  848. this.setStatus(uin, uin.status, two, one);
  849. },
  850. openLink(link) {
  851. window.open(link, '_blank')
  852. },
  853. // 改变基本字段属性
  854. changeBaseValue(index, input, status) {
  855. if (this.editData[0].content[0].uInput[index].input !== input) {
  856. this.editData[0].content[0].uInput[index].input = input
  857. this.editData[0].content[0].uInput[index].status = status
  858. }
  859. },
  860. selectChange(uni, status, two, one) {
  861. //状态更新
  862. if (uni.status === '-1' || uni.status === '2') {
  863. status = 2
  864. }
  865. this.setStatus(uni, status, two, one)
  866. },
  867. openHref() {
  868. if (!issave) {
  869. alert("请先保存数据!")
  870. } else {
  871. if (nextid === "") {
  872. showMsg("数据已经全部标注完")
  873. } else {
  874. window.location.href = "/front/user/remark/detail?pid=" + {{ .T.pid }} + "&did=" + nextid + "&s_sourceinfo=" + {{ .T.s_sourceinfo }}
  875. }
  876. }
  877. },
  878. // 检查一级是否需要改变状态
  879. checkOneStatus: function (config) {
  880. var tempObj = {
  881. obj: config.type ? config.one : config.two
  882. }
  883. if (config.type) {
  884. tempObj.list = config.one.content
  885. } else {
  886. tempObj.list = config.two.uInput
  887. }
  888. var statusList = [0, 0, 0, 0, 0]
  889. for (var i in tempObj.list) {
  890. var tempList = tempObj.list[i]
  891. var tempIndex = Number(tempList.status)
  892. if (tempIndex === -1) {
  893. tempIndex = 0
  894. }
  895. statusList[tempIndex] = Number(statusList[tempIndex]) + 1
  896. }
  897. if (statusList[1] > 0) {
  898. tempObj.obj.status = 1
  899. }
  900. if (statusList[4] > 0 || statusList[3] > 0 || statusList[2] > 0) {
  901. tempObj.obj.status = 2
  902. }
  903. if (statusList[4] === tempObj.list.length) {
  904. tempObj.obj.status = 4
  905. if (tempObj.obj.title === "标的信息" || tempObj.obj.title === "多包信息" || tempObj.obj.title === "中标候选人信息") {
  906. tempObj.obj.status = 2
  907. }
  908. }
  909. if (statusList[3] === tempObj.list.length) {
  910. tempObj.obj.status = 2
  911. }
  912. if (statusList[2] === tempObj.list.length) {
  913. tempObj.obj.status = 2
  914. }
  915. if (statusList[0] === tempObj.list.length) {
  916. tempObj.obj.status = -1
  917. }
  918. if (!config.type) {
  919. this.checkOneStatus({
  920. one: config.one,
  921. two: config.two,
  922. type: true
  923. })
  924. }
  925. },
  926. //切换状态按钮
  927. setStatus:function (witch, s, two, one) {
  928. var key = witch.key
  929. //校验日期格式
  930. if (key === "bidendtime" || key === "bidopentime" || key === "project_startdate" || key === "project_completedate" ||
  931. key === "publishtime" || key === "signaturedate") {
  932. var val = witch.input
  933. if (val !== "") {
  934. var reg = /^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$/;
  935. var regExp = new RegExp(reg);
  936. if (!regExp.test(val)) {
  937. this.$message({
  938. message: witch.title + ",日期格式错误!正确格式:2006-01-02 15:04:05",
  939. type: 'warning',
  940. duration: 2000,
  941. offset: 300
  942. });
  943. //alert(witch.title+",日期格式错误!正确格式:2006-01-02 15:04:05")
  944. return
  945. }
  946. }
  947. }
  948. if (s === '2' && !one && !two && witch.content.length === 0) {
  949. return
  950. }
  951. witch.status = s;
  952. if (two) {
  953. this.checkOneStatus({
  954. one: one,
  955. two: two,
  956. type: false
  957. })
  958. }
  959. },
  960. //二级删除
  961. delNewTwo: function (one, index, two) {
  962. //two.ck_isnew = false //目前点删除按钮页面直接不显示,但是集合索引位置不变,所以加了此代码
  963. //two.show = false
  964. if (two.isnew) {
  965. one.content.splice(index, 1)
  966. } else {
  967. two.show = false
  968. two.status = 4
  969. this.saveDataTwo(two, 4, one)
  970. }
  971. this.checkOneStatus({
  972. one: one,
  973. two: two,
  974. type: true
  975. })
  976. },
  977. /*add style*/
  978. addStyle: function (data) {
  979. return prettyPrint(data).replace(/(checkAllTag|checkType|showCheck|wstatus|status|key|title|input|content|uInput|selectArr|select|show|true)/g, "<mark>$1</mark>")
  980. },
  981. /*同步修改源码*/
  982. changeText: function (boolean) {
  983. try {
  984. var tempText = JSON.parse(this.$refs.text.innerText.replace(/(\n|\s)/g, ''))
  985. if (boolean) {
  986. this.tagvalues = tempText
  987. } else {
  988. this.editData = tempText
  989. }
  990. } catch (err) {
  991. alert('源码修改失败')
  992. }
  993. },
  994. goText: function (value) {
  995. /*重置Html*/
  996. this.pageHtml = this.getPageInfo.html
  997. if (!value) {
  998. return false
  999. }
  1000. var rs = new RegExp('(' + value + ')', 'gi')
  1001. //选中input框值文本高亮
  1002. if (rs.test(this.pageHtml)) {
  1003. this.pageHtml = this.pageHtml.replace(rs, '<mark>$1</mark>')
  1004. /*延迟查询dom,防止dom未插入*/
  1005. var $this = this
  1006. setTimeout(function () {
  1007. $this.goMark(value)
  1008. }, 150)
  1009. } else {
  1010. /*重置Html*/
  1011. this.pageHtml = this.getPageInfo.html
  1012. }
  1013. },
  1014. goMark: function (value) {
  1015. var mLength = document.querySelectorAll('mark').length
  1016. if (this.scrollCache.value === value) {
  1017. this.scrollCache.index = (this.scrollCache.index + 1) % mLength
  1018. } else {
  1019. this.scrollCache.index = 0
  1020. }
  1021. this.scrollCache.value = value
  1022. /*滚动到第一个mark*/
  1023. var temp = document.querySelectorAll('mark')[this.scrollCache.index]
  1024. $("mark").removeClass('focus')
  1025. $(temp).addClass('focus')
  1026. document.querySelector('.article').scrollTop = offset(temp).top - window.screen.height / 2
  1027. },
  1028. // markTag:function(n){
  1029. // $.ajax({
  1030. // url:"/markTag",
  1031. // method:"post",
  1032. // data: {tag:n,_id:_id},
  1033. // success:function(res){
  1034. // if(res){
  1035. // document.getElementById("com-alert-val").innerHtml="标记成功";
  1036. // var label1 = document.getElementById("com-alert");
  1037. // label1.style.display="block";
  1038. // setTimeout(function(){label1.style.display="none";},1000)
  1039. // }
  1040. // }
  1041. // });
  1042. // },
  1043. addChild: function (one, oindex) {
  1044. var tempNode = {}
  1045. switch (one.title) {
  1046. case "标的信息": {
  1047. tempNode = {
  1048. //content: [],
  1049. show: true,
  1050. isnew: true,
  1051. status: 2,
  1052. title: "标的物",
  1053. uInput: JSON.parse(JSON.stringify(pclfInput))
  1054. }
  1055. break
  1056. }
  1057. case "多包信息": {
  1058. tempNode = {
  1059. //content: [],
  1060. show: true,
  1061. status: 2,
  1062. isnew: true,
  1063. title: "子包",
  1064. uInput: JSON.parse(JSON.stringify(pfInput))
  1065. }
  1066. break
  1067. }
  1068. case "中标候选人信息": {
  1069. tempNode = {
  1070. //content: [],
  1071. show: true,
  1072. status: 2,
  1073. isnew: true,
  1074. title: "候选人",
  1075. uInput: JSON.parse(JSON.stringify(wodfInput))
  1076. }
  1077. break
  1078. }
  1079. }
  1080. // if (one.status >= 2) {
  1081. // one.status = '2'
  1082. // }
  1083. one.content.push(tempNode)
  1084. this.checkOneStatus({
  1085. one: one,
  1086. type: true
  1087. })
  1088. this.$nextTick(() => {
  1089. var tempN = $(".edit.one").eq(oindex).find(".edit-title")
  1090. var goTop = tempN.eq(tempN.length - 1).offset().top
  1091. setTimeout(() => {
  1092. $(".operation").scrollTop($(".operation").scrollTop() + goTop)
  1093. }, 150)
  1094. })
  1095. },
  1096. // 新增子包中标信息字段
  1097. addThreeChild:function (two, n, one) {
  1098. two.uInput.push({
  1099. input: "",
  1100. key: 'winner',
  1101. status: "2",
  1102. title: '标段(包)中标单位'
  1103. })
  1104. two.uInput.push({
  1105. input: "",
  1106. key: 'bidamount',
  1107. status: "2",
  1108. title: '标段(包)中标金额'
  1109. })
  1110. two.status = 2
  1111. this.checkOneStatus({
  1112. one: one,
  1113. two: two,
  1114. type: false
  1115. })
  1116. },
  1117. //保存
  1118. saveDataTwo:function (two, n, one) {
  1119. two.uInput.forEach(function (v) {
  1120. var key = v.key
  1121. if (key === "bidendtime" || key === "bidopentime" || key === "project_startdate" || key === "project_completedate" ||
  1122. key === "publishtime" || key === "signaturedate") {
  1123. var val = v.input
  1124. if (val !== "") {
  1125. var reg = /^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$/;
  1126. var regExp = new RegExp(reg);
  1127. if (!regExp.test(val)) {
  1128. this.$message({
  1129. message: v.title + ",日期格式错误!正确格式:2006-01-02 15:04:05",
  1130. type: 'warning',
  1131. duration: 2000,
  1132. offset: 300
  1133. });
  1134. //alert(v.title+",日期格式错误!正确格式:2006-01-02 15:04:05")
  1135. return
  1136. }
  1137. }
  1138. }
  1139. if (n === "1" && v.status === "-1") {
  1140. v.status = n
  1141. } else if (n === -1) {
  1142. v.status = n
  1143. } else if (n === 2) {
  1144. v.status = n
  1145. } else if (n === 4) {
  1146. v.status = n
  1147. }
  1148. });
  1149. two.status = n
  1150. this.checkOneStatus({
  1151. one: one,
  1152. two: two,
  1153. type: false
  1154. })
  1155. /**
  1156. two.content.forEach(function(v) {
  1157. v.uInput.forEach(function(value) {
  1158. if (value.input && value.input != '') {
  1159. value.status = n
  1160. }
  1161. })
  1162. })
  1163. */
  1164. },
  1165. saveDataOne:function (one, n) {
  1166. //保存后的样式
  1167. var _this = this
  1168. one.content.forEach(function (v) {
  1169. v.uInput.forEach(function (value) {
  1170. var key = value.key
  1171. if (n === 1) {
  1172. if (key === "bidendtime" || key === "bidopentime" || key === "project_startdate" || key === "project_completedate" ||
  1173. key === "publishtime" || key === "signaturedate") {
  1174. var val = value.input
  1175. if (val !== "") {
  1176. var reg = /^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$/;
  1177. var regExp = new RegExp(reg);
  1178. if (!regExp.test(val)) {
  1179. this.$message({
  1180. message: value.title + ",日期格式错误!正确格式:2006-01-02 15:04:05",
  1181. type: 'warning',
  1182. duration: 2000,
  1183. offset: 300
  1184. });
  1185. //alert(value.title+",日期格式错误!正确格式:2006-01-02 15:04:05")
  1186. return
  1187. }
  1188. }
  1189. }
  1190. }
  1191. // 取消全部,通过时判断状态是否处于修改新增等
  1192. if (n === "1" && value.status === "-1") {
  1193. value.status = n
  1194. } else if (n === "-1") {
  1195. value.status = n
  1196. }
  1197. })
  1198. _this.checkOneStatus({
  1199. two: v,
  1200. one: one,
  1201. type: false
  1202. })
  1203. });
  1204. },
  1205. //验证保存提示
  1206. open:function (stype) {
  1207. this.$confirm('是否保存?', '提示', {
  1208. confirmButtonText: '确定',
  1209. cancelButtonText: '取消',
  1210. type: 'warning'
  1211. }).then(() => {
  1212. this.upChange(stype)
  1213. }).catch(() => {
  1214. });
  1215. },
  1216. //保存事件
  1217. upChange: function (stype) {
  1218. console.log(this.editData)
  1219. var noTagKey = [];
  1220. console.log(allCheckFields)
  1221. this.editData.filter(function (one) {
  1222. if (one.title === "标的信息" || one.title === "多包信息" || one.title === "中标候选人信息") {
  1223. if (allCheckFields[one.key] && one.status === -1) {
  1224. noTagKey.push(one.title);
  1225. }
  1226. } else {
  1227. one.content.filter(function (v) {
  1228. v.uInput.filter(function (u) {
  1229. if (allCheckFields[u.key] && u.status === -1) {
  1230. noTagKey.push(u.title);
  1231. }
  1232. })
  1233. })
  1234. }
  1235. })
  1236. if (noTagKey.length > 0) {
  1237. var fieldText = noTagKey.join(",");
  1238. fieldText = fieldText.replace(/\([^\)]*\)/g, "");
  1239. this.$alert("未标注字段:" + fieldText);
  1240. return
  1241. }
  1242. var resultStatus = false
  1243. if (stype === 1) {//全部字段验证
  1244. var checkAllKey = this.editData.filter(function (one) {
  1245. var otherOne = one.content.filter(function (v) {
  1246. return v.uInput.filter(function (u) {
  1247. return u.status === '-1'
  1248. }).length
  1249. })
  1250. if ((one.title === "标的信息" || one.title === "多包信息" || one.title === "中标候选人信息") && (one.status === "-1")) {
  1251. return true
  1252. } else {
  1253. return otherOne.length
  1254. }
  1255. })
  1256. resultStatus = !Boolean(checkAllKey.length)
  1257. } else {//部分字段验证
  1258. var otherTag = 0 //标注状态 0:没标 1:标注成功 2:标注失败
  1259. var baseTag = 0
  1260. this.editData.filter(function (one) {
  1261. //多包信息、中标候选人信息在为标注失败的前提下检测标注状态,一个失败不能保存
  1262. if (otherTag < 2) {
  1263. if (one.title === "标的信息" || one.title === "多包信息" || one.title === "中标候选人信息") {
  1264. if (one.status === "-1") {//没标
  1265. if (otherTag !== 1) {//前一个标注成功不用记录后一个是否未标
  1266. otherTag = 0
  1267. }
  1268. } else {
  1269. if (one.content.length === 0) {//不含子包
  1270. if (one.status === '2') {
  1271. otherTag = 2 //失败
  1272. } else {
  1273. otherTag = 1 //成功
  1274. }
  1275. } else {//含子包
  1276. if (one.title === "标的信息") {
  1277. var otherOne = one.content.filter(function (v) {
  1278. if (v.status >= 1) {//子信息标注
  1279. var twoLength = v.uInput.filter(function (u) {
  1280. return u.status === '-1'
  1281. })
  1282. if (twoLength.length > 0) {
  1283. otherTag = 2
  1284. }
  1285. return true //返回此条信息被标注
  1286. }
  1287. })
  1288. if (otherTag !== 2) {
  1289. if (otherOne.length > 0) {//
  1290. otherTag = 1
  1291. } else {
  1292. otherTag = 2
  1293. }
  1294. }
  1295. } else {
  1296. var otherOne = one.content.filter(function (v) {
  1297. return v.uInput.filter(function (u) {
  1298. return u.status === '-1'
  1299. }).length
  1300. })
  1301. if (otherOne.length > 0) {//
  1302. otherTag = 2
  1303. } else {
  1304. otherTag = 1
  1305. }
  1306. }
  1307. }
  1308. }
  1309. } else {
  1310. var baseOne = one.content.filter(function (v) {
  1311. return v.uInput.filter(function (u) {
  1312. return u.status !== '-1'
  1313. }).length
  1314. })
  1315. if (baseOne.length > 0) {//基本字段
  1316. baseTag = 1
  1317. }
  1318. }
  1319. }
  1320. })
  1321. if (otherTag === 0 && baseTag === 1) {
  1322. resultStatus = true
  1323. } else if (otherTag === 1) {
  1324. resultStatus = true
  1325. }
  1326. }
  1327. if (!resultStatus) {
  1328. this.$alert("未标注完成");
  1329. return
  1330. }
  1331. var d = JSON.stringify(this.editData);
  1332. console.log(d)
  1333. var _this = this
  1334. $.ajax({
  1335. url: "/front/data/mark",
  1336. method: "post",
  1337. data: {"data": d, "s_infoid": _id, "s_usertaskid": {{ .T.tid}}},
  1338. success: function (res) {
  1339. if (res) {
  1340. _this.$message({
  1341. message: '保存成功',
  1342. type: 'success',
  1343. duration: 1000,
  1344. offset: 300
  1345. });
  1346. issave = true//保存成功
  1347. }
  1348. },
  1349. error: function (err) {
  1350. alert(err);
  1351. }
  1352. });
  1353. }
  1354. //保存提示
  1355. // open:function(one, type) {
  1356. // this.$confirm('是否保存?', '提示', {
  1357. // confirmButtonText: '确定',
  1358. // cancelButtonText: '取消',
  1359. // type: 'warning'
  1360. // }).then(() => {
  1361. // if (type) {
  1362. // this.saveOneData(one)
  1363. // } else {
  1364. // this.upChange()
  1365. // }
  1366. // }).catch(() => {
  1367. // });
  1368. // },
  1369. //一级保存
  1370. // saveOneData: function (one) {
  1371. // if (one.title==="标的信息"||one.title==="多包信息"||one.title==="中标候选人信息"){
  1372. // if(one.status === "-1"){
  1373. // this.$alert(one.title+" 未标注完成")
  1374. // return
  1375. // }else if (one.status !=="-1"){
  1376. // var isAlert = one.content.filter(function(v) {
  1377. // return v.uInput.filter(function (u) {
  1378. // return u.status === '-1'
  1379. // }).length
  1380. // })
  1381. // if (isAlert.length) {
  1382. // this.$alert(one.title+" 未标注完成")
  1383. // return
  1384. // }
  1385. // }
  1386. // }
  1387. // onetext = "["+ JSON.stringify(one) +"]";
  1388. // $.ajax({
  1389. // url:"/center/biaozhu",
  1390. // method:"post",
  1391. // data: {key:onetext,_id:_id},
  1392. // success:function(res){
  1393. // if(res){
  1394. // document.getElementById("com-alert-val").innerHtml="保存成功";
  1395. // var label1 = document.getElementById("com-alert");
  1396. // label1.style.display="block";
  1397. // setTimeout(function(){
  1398. // label1.style.display="none";
  1399. // },
  1400. // 1000)
  1401. // }
  1402. // },
  1403. // error:function(err){
  1404. // alert(err);
  1405. // }
  1406. // });
  1407. // },
  1408. }
  1409. })
  1410. function offset(elem) {
  1411. if (!elem) elem = this;
  1412. var x = elem.offsetLeft;
  1413. var y = elem.offsetTop;
  1414. while (elem === elem.offsetParent) {
  1415. x += elem.offsetLeft;
  1416. y += elem.offsetTop;
  1417. }
  1418. return {left: x, top: y};
  1419. }
  1420. </script>
  1421. </html>