sign_detail.blade.php 58 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517
  1. @extends('layouts.base')
  2. @section('content')
  3. @section('title', '合同信息')
  4. <script type="text/javascript" src="{{static_url('js/pdfjs/pdf.js')}}"></script>
  5. <script>
  6. pdfjsLib.GlobalWorkerOptions.workerSrc ="{{static_url('js/pdfjs/pdf.worker.min.js')}}";
  7. </script>
  8. <div class="w1200 m0a">
  9. <div class="right-titpos">
  10. <ul class="add-snav">
  11. <li class="active"><a href="#">合同信息</a></li>
  12. </ul>
  13. </div>
  14. <div id="app">
  15. <template>
  16. <div id="pageContent" class="pageContent_2lAGg">
  17. <div class="leftContent_2NoKi">
  18. <div class="doc-list-context">
  19. <div>
  20. <el-tabs v-model="activeNameLeft" @tab-click="handleClick" :stretch="true">
  21. <el-tab-pane label="合同" name="1"></el-tab-pane>
  22. <el-tab-pane label="附件" name="2"></el-tab-pane>
  23. </el-tabs>
  24. </div>
  25. <template v-if="activeNameLeft == 1">
  26. <div class="doc-list-title">合同 <span>(1份)</span></div>
  27. <div class="doc-list">
  28. <div class="doc-item">
  29. <div class="doc-img">
  30. <img src="../../assets/images/pdfpng.png"
  31. alt="">
  32. <div class="doc-page-num">[[page_count]]</div>
  33. </div>
  34. <div class="doc-name">[[contract_info.contract_doc_name]]</div>
  35. </div>
  36. <!--<div class="componentsList_1OIrB">-->
  37. <!--<div class="componentArea">-->
  38. <!--<div class="itemConentStyle"><span class="need">*</span><span>文本名称</span></div>-->
  39. <!--<p class="input"></p><div class="errorInfo_3lZie">请填写当前控件</div>-->
  40. <!--</div>-->
  41. <!--</div>-->
  42. <div class="componentSign">
  43. <p class="sealCompInfo_3v9iQ"><span class="need">*</span><span><span>甲方</span><em>(<span>签署区</span>)</em></span></p><div class="itemConentStyle_2MWEL"><div class="infoMsg_3NkPg">签署区</div><i class="iconfont icon-pm_auction_success"></i></div>
  44. </div>
  45. </div>
  46. </template>
  47. <template v-if="activeNameLeft == 2">
  48. <div class="doc-list-title" v-if="contract_info.contract_attach.length == 0">暂无附件</div>
  49. <div class="doc-list-title" v-if="contract_info.contract_attach.length > 0">附件 <span>([[contract_info.contract_attach.length]]份)</span></div>
  50. <div class="doc-list">
  51. <div class="doc-item" v-for="(item, index) in contract_info.contract_attach" :key="index">
  52. <div class="doc-img">
  53. <img src="../../assets/images/pdfpng.png"
  54. alt="">
  55. <div class="doc-page-num">[[page_count]]</div>
  56. </div>
  57. <div class="doc-name">[[item.file_name]]</div>
  58. </div>
  59. </div>
  60. </template>
  61. </div>
  62. </div>
  63. <div class="pdfContent_1PW2f">
  64. <div class="pdf-header">
  65. <div class="block">
  66. <span class="demonstration">[[value1*100]]%</span>
  67. <div class="slider">
  68. <el-slider v-model="value1" :min="0.5" :max="2" :step="0.25" @change="handleChange"></el-slider>
  69. </div>
  70. </div>
  71. <div class="input">
  72. <span>Page: <input type="text" class="input-text" v-model="page_num" placeholder="1"> / [[page_count]]</span>
  73. <el-button @click="jump" type="text">跳转</el-button>
  74. <!--<span>全屏</span>-->
  75. </div>
  76. </div>
  77. <div class="pdf-container" ref="pdfBox" v-loading="!isShow"
  78. element-loading-text="拼命加载中"
  79. element-loading-spinner="el-icon-loading"
  80. element-loading-background="rgba(0, 0, 0, 0.1)">
  81. <div id="sun"></div>
  82. <div class="pdf-box" id="pdf-box" :style="{width: pdfWidth+'px', left: showEdges? '-60px': ''}">
  83. <div class="pdfPage_1yRne" :style="{width: pdfWidth+'px',height: pdfHeight+ 'px'}" v-for="page in page_count" :key="page">
  84. <canvas class="pdf-item" :id="'the-canvas'+page" ></canvas>
  85. <div class="dragLayer_3ccsq" :id="'can'+ page"></div>
  86. <transition name="slide-fade">
  87. <div v-if="showEdges" :id="'edge_'+page" :class="{'es-pdf-page__edges--visible': signEdges}" class="es-pdf-page__edges" style="width: 120px;" :style="{width: slideWidth+'px',height: pdfHeight+ 'px'}"></div>
  88. </transition>
  89. </div>
  90. </div>
  91. <!--<div class="bottom-btn" @click="showEdges = !showEdges"><span>[[showEdges? '单页盖章':'骑缝签章']]</span></div>-->
  92. </div>
  93. </div>
  94. <div class="taskInfoArea_3ThxW">
  95. <div class="tab-bar">
  96. <el-tabs v-model="activeName" @tab-click="handleClick" :stretch="true">
  97. {{--<el-tab-pane label="我的印章" name="1"></el-tab-pane>--}}
  98. <el-tab-pane label="任务信息" name="2"></el-tab-pane>
  99. </el-tabs>
  100. </div>
  101. <div class="tab-context">
  102. {{--<div class="item" v-show="activeName == 1 && can_sign == 1 && is_cc != 1 && auth_status == 1 && contract_info.status < 2 && sign_status != 1">
  103. <div v-if="company_seals.length>0">
  104. <p class="title">企业印章</p>
  105. <div class="seal-box-wrap">
  106. <div class="seal-box" v-for="seal in company_seals" :key="seal.id">
  107. <div class="seal-wrapper-item">
  108. <div class="sign-img" :style="{backgroundImage: 'url(' + seal.has_one_seal.seal_url + ')'}"
  109. style="height: 100px;width: 100px" v-bind:id="seal.has_one_seal.id"
  110. @mousedown='signPic'>
  111. <!--:style="{backgroundImage: 'url(' + seal.has_one_seal.seal_url + ')'}"-->
  112. <div class="delete" @click.stop="deleteIt">删除</div>
  113. </div>
  114. </div>
  115. </div>
  116. </div>
  117. </div>
  118. <div v-if="person_seals.length>0">
  119. <p class="title">个人印章</p>
  120. <div class="seal-box-wrap">
  121. <div class="seal-box" v-for="seal in person_seals" :key="seal.id">
  122. <div class="seal-wrapper-item">
  123. <div class="sign-img" :style="{backgroundImage: 'url(' + seal.seal_url + ')'}"
  124. style="height: 100px;width: 100px" v-bind:id="seal.id"
  125. @mousedown='signPic'>
  126. <!--:style="{backgroundImage: 'url(' + seal.seal_url + ')'}"-->
  127. <div class="delete" @click.stop="deleteIt">删除</div>
  128. </div>
  129. </div>
  130. <p class="seal-box-title">[[seal.name]]</p>
  131. </div>
  132. <div class="seal-box">
  133. <div class="fileAddItem_1Vqb7" @click="toAddSeal">
  134. <i class="iconfont icon-adsystem_icon_add"></i>
  135. <p class="defaultInfoStyle_2mgdq">添加印章</p>
  136. </div>
  137. </div>--}}
  138. <div class="sign-flow-info"{{-- v-show="activeName == 2"--}}>
  139. <div class="sign-flow-info-detail">
  140. <div class="detail-item">
  141. <span class="detail-item-title">合同名称</span>
  142. <span class="detail-item-desc wrap">[[contract_info.name]]</span>
  143. </div>
  144. <div class="detail-item">
  145. <span class="detail-item-title">发起方</span>
  146. <span class="detail-item-desc wrap">[[contract_info.account_name]]</span>
  147. </div>
  148. <div class="detail-item">
  149. <span class="detail-item-title">发起时间</span>
  150. <span class="detail-item-desc wrap">[[contract_info.created_at]]</span>
  151. </div>
  152. {{--<div class="detail-item">
  153. <span class="detail-item-title">截止时间</span>
  154. <span class="detail-item-desc wrap">[[contract_info.sign_end_date]]</span>
  155. </div>
  156. <div class="detail-item">
  157. <span class="detail-item-title">文件有效截止时间</span>
  158. <span class="detail-item-desc wrap">[[contract_info.contract_end_date]]</span>
  159. </div>--}}
  160. <p class="detail-item-title">签署方</p>
  161. </div>
  162. <div class="userItem" v-for="user in roles_list" :key="user.id">
  163. <div style="flex: 1;display: flex">
  164. {{--<div class="user">[[user.name[0]]]</div>todo 报错待修改--}}
  165. <div class="user-name"><span style="color: #0099e6">[[user.company_name]]</span><span>[[user.name]]</span></div>
  166. </div>
  167. <div class="tag"><span v-if="user.sign_status == 1">已签署</span><span v-else>未签署</span>
  168. {{--<i v-clipboard:copy="user.sign_short_url" v-clipboard:success="onCopy" v-clipboard:error="onError" class="iconfont icon-all_link"></i>--}}</div>
  169. </div>
  170. {{--<p class="detail-item-title" style="text-align: left;margin: 15px 0">文件时间流</p>
  171. <div class="block">
  172. <el-timeline>
  173. <el-timeline-item
  174. v-for="(activity, index) in activities"
  175. :key="index"
  176. :icon="activity.icon"
  177. :type="activity.type"
  178. :color="activity.color"
  179. :size="activity.size"
  180. :timestamp="activity.timestamp">
  181. [[activity.content]]
  182. </el-timeline-item>
  183. </el-timeline>
  184. </div>--}}
  185. </div>
  186. </div>
  187. </div>
  188. {{--<div style="text-align: center;margin-top: 20px;">
  189. <el-button type="primary" @click="showSign">确定签署</el-button>
  190. </div>--}}
  191. </div>
  192. {{--<div v-if="sign_status == 1 && contract_info.status < 2">
  193. <div style="margin-top: 40px">
  194. <img class="finish-img" src="../../assets/images/sign.png" alt="">
  195. </div>
  196. <p class="title">已签署</p>
  197. </div>
  198. <div v-if="contract_info.status == 2">
  199. <div style="margin-top: 40px">
  200. <img class="finish-img" src="../../assets/images/complete.png" alt="">
  201. </div>
  202. <p class="title">已完成</p>
  203. </div>
  204. <div v-if="contract_info.status == 3">
  205. <div style="margin-top: 40px">
  206. <img class="finish-img" src="../../assets/images/cancel.png" alt="">
  207. </div>
  208. <p class="title">已撤销</p>
  209. </div>
  210. <div v-if="contract_info.status == 4">
  211. <div style="margin-top: 40px">
  212. <img class="finish-img" src="../../assets/images/overtime.png" alt="">
  213. </div>
  214. <p class="title">已超时</p>
  215. </div>
  216. <div class="real" v-show="activeName == 1 && auth_status != 1">
  217. <div>
  218. <span class="gray">请先完成个人实名认证</span>
  219. <el-button type="primary" @click="toPerson">去认证</el-button>
  220. </div>
  221. </div>--}}
  222. {{--<el-dialog
  223. title="手机短信意愿签署"
  224. :visible.sync="signVisible"
  225. width="600px"
  226. custom-class="tips-dialog"
  227. style="margin:0 auto;text-align: center;">
  228. <div class="dialog-box">
  229. <p class="phone">手机号码: [[mobile]]</p>
  230. <div class="send-code">
  231. <p class="code-title">输入验证码:</p><el-input v-model.trim="code" style="margin-right: 20px"></el-input><el-button type="primary" @click="sendCode" size="small" v-if="count==0">获取手机验证码</el-button><el-button type="primary" disabled v-if="count!=0" size="small">[[count]] 秒后重新获取</el-button>
  232. </div>
  233. </div>
  234. <el-button type="primary" @click="companySign">确定签署</el-button>
  235. </el-dialog>
  236. <el-dialog
  237. title="实名认证"
  238. :visible.sync="showPerson" :close-on-click-modal="false" :show-close="false"
  239. width="600px"
  240. custom-class="tips-dialog"
  241. style="margin:0 auto;text-align: center;">
  242. <div class="dialog-box" style="padding: 30px;font-size: 16px;">
  243. 如您已完成认证,请点击签署合同继续完成签署!
  244. </div>
  245. <el-button type="primary" @click="getData">签署合同</el-button>
  246. </el-dialog>--}}
  247. </template>
  248. </div>
  249. </div>
  250. <script>
  251. var app = new Vue({
  252. el: "#app",
  253. delimiters: ['[[', ']]'],
  254. data() {
  255. return {
  256. isShow: false,
  257. setFlag: false,
  258. user_role_id: '',
  259. showPerson: false,
  260. sign_status: 0,
  261. auth_status: 1,
  262. is_cc: 0,
  263. can_sign: 0,
  264. signEdges: false,
  265. showEdges: false,
  266. signVisible: false,
  267. count: 0,
  268. timer: null,
  269. dom: null,
  270. scrollTop: 0,
  271. activeNameLeft: '1',
  272. activeName: "1",
  273. pdfUrl: "",// 这里是pdf文件地址,后台给的流文件请求地址也是可以的
  274. pdfDoc: null,// pdfjs 生成的对象
  275. pageNum: 1,//
  276. value1: 1,
  277. scale: 1.0,// 放大倍数
  278. page_num: 0,// 当前页数
  279. page_count: 0,// 总页数
  280. maxscale: 2,// 最大放大倍数
  281. minscale: 0.5,// 最小放大倍数
  282. pdfWidth: 0,
  283. pdfHeight: 0,
  284. slideWidth: 120,
  285. right: true,
  286. left: true,
  287. code: "",
  288. mobile: '',
  289. pos_x: '',
  290. pos_y: '',
  291. posPage: '',
  292. seal_id: '',
  293. // href: '',
  294. activities: [],
  295. commonStructsList: [],
  296. company_seals: [],
  297. contract_info: {},
  298. contract_logs: [],
  299. person_seals: [],
  300. roles_list: []
  301. }
  302. },
  303. created(){
  304. this.contract_id = parseInt("{{$id}}");
  305. this.mobile = localStorage.getItem("siteMobile");
  306. },
  307. mounted(){
  308. this.$nextTick(function() {
  309. this.$refs.pdfBox.addEventListener("scroll", this.handleScroll, false);
  310. this.getData();
  311. });
  312. },
  313. watch:{
  314. scale(new1, old1) {
  315. document.querySelectorAll(".mark").forEach((item) => {
  316. item.style.left = (parseInt(item.style.left) / (old1 / new1)) + "px";
  317. item.style.top = (parseInt(item.style.top) / (old1 / new1)) + "px";
  318. item.style.height = 100 * new1 + "px";
  319. item.style.width = 100 * new1 + "px";
  320. });
  321. document.querySelectorAll(".text_mark").forEach((item) => {
  322. item.style.left = (parseInt(item.style.left) / (old1 / new1)) + "px";
  323. item.style.top = (parseInt(item.style.top) / (old1 / new1)) + "px";
  324. item.style.height = 28 * new1 + "px";
  325. item.style.width = 190 * new1 + "px";
  326. });
  327. document.querySelectorAll(".text_mark2").forEach((item) => {
  328. item.style.left = (parseInt(item.style.left) / (old1 / new1)) + "px";
  329. item.style.top = (parseInt(item.style.top) / (old1 / new1)) + "px";
  330. item.style.height = 100 * new1 + "px";
  331. item.style.width = 100 * new1 + "px";
  332. });
  333. this.slideWidth = 120 *new1;
  334. }
  335. },
  336. methods: {
  337. toPerson() {
  338. this.showPerson = true;
  339. window.open(this.fun.getSiteRoot() + "/#/real_people");
  340. },
  341. onCopy: function(e) {
  342. this.$message.success("复制成功")
  343. },
  344. onError: function(e) {
  345. this.$message.error("复制失败")
  346. },
  347. showSign() {
  348. if (document.querySelectorAll('.mark').length <= 0) {
  349. this.$message.error("请先拖拽盖章")
  350. return;
  351. }
  352. this.signVisible = true;
  353. },
  354. // 获取手机验证码
  355. sendCode() {
  356. this.$http.post("{!!yzWebUrl('plugin.yun-sign.frontend.contract.send-code')!!}", {contract_id: this.contract_id}, "loading").then(response => {
  357. if (response.result === 1) {
  358. const TIME_COUNT = 60;
  359. if (!this.timer) {
  360. this.count = TIME_COUNT;
  361. this.timer = setInterval(() => {
  362. if (this.count > 0 && this.count <= TIME_COUNT) {
  363. this.count--;
  364. } else {
  365. clearInterval(this.timer);
  366. this.timer = null;
  367. }
  368. }, 1000)
  369. }
  370. } else {
  371. this.$message.error(response.msg);
  372. }
  373. }).catch(err => {
  374. console.log(err);
  375. });
  376. },
  377. companySign() {
  378. if (!this.code){
  379. this.$message.error("请输入验证码");
  380. return
  381. }
  382. let sign_type = 1;
  383. if(this.showEdges) {
  384. sign_type = 2;
  385. }else {
  386. sign_type = 1;
  387. }
  388. let json = {
  389. sign_type: sign_type,
  390. total_page: this.page_count,
  391. posPage: this.posPage,
  392. seal_id: this.seal_id,
  393. width: 100,
  394. pos_x: this.pos_x/this.scale,
  395. pos_y: (this.pdfHeight/this.scale) - (this.pos_y/this.scale)-100, //转成bottom
  396. updated_at: this.contract_info.updated_at,
  397. id: this.contract_id,
  398. code: this.code,
  399. };
  400. this.$http.post("{!!yzWebUrl('plugin.yun-sign.frontend.contract.sign-contract')!!}", json, "loading").then(response => {
  401. this.code = "";
  402. if (response.result === 1) {
  403. this.signVisible = false;
  404. this.$router.push(this.fun.getUrl("Manage"));
  405. } else {
  406. this.$message.error(response.msg);
  407. }
  408. }).catch(err => {
  409. this.code = "";
  410. console.log(err);
  411. });
  412. },
  413. // 获取模版
  414. getData() {
  415. this.showPerson = false;
  416. this.$http.post("{!!yzWebUrl('plugin.shop-esign.admin.contract.getSignDetail')!!}", {id: this.contract_id}).then(response => {
  417. if (response.data.result === 1) {
  418. this.user_role_id = response.data.data.user_role_id;
  419. this.sign_status = response.data.data.sign_status;
  420. this.auth_status = response.data.data.auth_status;
  421. //this.is_cc = response.data.is_cc;
  422. this.can_sign = response.data.data.can_sign;
  423. this.company_seals = response.data.data.company_seals;
  424. this.contract_info = response.data.data.contract_info;
  425. //this.contract_logs = response.data.contract_logs;
  426. this.person_seals = response.data.data.person_seals;
  427. this.roles_list = response.data.data.roles_list;
  428. this.pdfUrl = this.contract_info.contract_doc_url;
  429. // this.pdfUrl = "/static/test.pdf";
  430. this._loadFile(this.pdfUrl);
  431. //this.commonStructsList = response.data.form_list;
  432. /*for(let i=0;i<this.contract_logs.length;i++){
  433. if(i === this.contract_logs.length-1){
  434. this.activities.push({
  435. content: this.contract_logs[i].status_desc,
  436. timestamp: this.contract_logs[i].created_at,
  437. color: "#0099e6"
  438. })
  439. }else {
  440. this.activities.push({
  441. content: this.contract_logs[i].status_desc,
  442. timestamp: this.contract_logs[i].created_at,
  443. })
  444. }
  445. }*/
  446. } else {
  447. this.$message.error(response.msg);
  448. }
  449. }).catch(err => {
  450. console.log(err);
  451. });
  452. },
  453. setTemplate() {
  454. const that = this;
  455. /*for (let i = 0; i < this.commonStructsList.length; i++) {
  456. if(that.commonStructsList[i].form_type == 2) {
  457. let Element = document.querySelector(".componentSign").cloneNode(true);
  458. document.querySelector('#can'+ that.commonStructsList[i].doc_page).appendChild(Element);
  459. Element.style.left = that.commonStructsList[i].pos_x + "px";
  460. Element.style.top = that.commonStructsList[i].pos_y + "px";
  461. Element.style.display = "flex";
  462. Element.classList.add("text_mark2");
  463. Element.setAttribute("page", that.commonStructsList[i].doc_page);
  464. Element.setAttribute('textId', that.commonStructsList[i].id);
  465. Element.setAttribute('role_id',that.commonStructsList[i].role_id);
  466. Element.childNodes[0].style.display = "flex";
  467. Element.childNodes[0].childNodes[1].childNodes[1].childNodes[1].innerText = that.commonStructsList[i].form_name;
  468. if(that.commonStructsList[i].role_id == '1'){
  469. Element.childNodes[0].childNodes[1].childNodes[0].innerText = '甲方';
  470. }else if(that.commonStructsList[i].role_id == '2'){
  471. Element.childNodes[0].childNodes[1].childNodes[0].innerText = '乙方';
  472. }else if(that.commonStructsList[i].role_id == '3'){
  473. Element.childNodes[0].childNodes[1].childNodes[0].innerText = '丙方';
  474. }
  475. }
  476. }*/
  477. },
  478. TextBlur(e) {
  479. // console.log(e.currentTarget.parentNode.childNodes);
  480. e.currentTarget.value=e.currentTarget.value.replace(/\s+/g,'');
  481. if(e.currentTarget.parentNode.childNodes[0].childNodes[0].style.display == "inline-block" && e.currentTarget.value == '') {
  482. e.currentTarget.parentNode.classList.add("needFill");
  483. e.currentTarget.parentNode.childNodes[3].style.display = "flex";
  484. }else {
  485. e.currentTarget.parentNode.classList.remove("needFill");
  486. e.currentTarget.parentNode.childNodes[3].style.display = "none";
  487. }
  488. },
  489. TextMouseenter(e) {
  490. e.currentTarget.childNodes[0].style.display = "flex";
  491. // e.currentTarget.childNodes[3].style.display = "block";
  492. },
  493. TextMouseleave(e) {
  494. e.currentTarget.childNodes[0].style.display = "none";
  495. // e.currentTarget.childNodes[3].style.display = "none";
  496. },
  497. TextDeleteIt(e) {
  498. document.querySelector(".dragLayer_3ccsq").removeChild(e.currentTarget.parentNode);
  499. },
  500. mouseenter(e) {
  501. e.currentTarget.childNodes[0].style.display = "block";
  502. },
  503. mouseleave(e) {
  504. e.currentTarget.childNodes[0].style.display = "none";
  505. },
  506. deleteIt(e) {
  507. e.currentTarget.parentNode.parentNode.removeChild(e.currentTarget.parentNode);
  508. },
  509. deleteIt2(){
  510. document.querySelectorAll(".slide-sign").forEach((item) => {
  511. item.parentNode.removeChild(item);
  512. });
  513. },
  514. deleteIt3(e) {
  515. e.currentTarget.parentNode.parentNode.childNodes[0].style.display = 'block';
  516. e.currentTarget.parentNode.parentNode.removeChild(e.currentTarget.parentNode);
  517. },
  518. signPic(e) {
  519. if (document.querySelectorAll('.mark').length >= 1) {
  520. this.$message.error("已经盖了印章")
  521. return;
  522. }
  523. let dom = e.currentTarget.cloneNode(true);
  524. let sidebarWidth = 0;
  525. if (document.querySelector("#app").clientWidth > 1026) {
  526. sidebarWidth = document.querySelector(".el-scrollbar__view").clientWidth;
  527. }
  528. dom.style.left = (this.getPos(e).x - 50 - sidebarWidth) + "px";
  529. dom.style.top = (this.getPos(e).y - 100) + "px";
  530. dom.className = "sign-img mark";
  531. document.querySelector("#pageContent").appendChild(dom);
  532. this.signEdges = true;
  533. document.onmousemove = e => {
  534. dom.style.left = (this.getPos(e).x - parseInt(dom.clientWidth / 2) - sidebarWidth) + "px";
  535. dom.style.top = (this.getPos(e).y - parseInt(dom.clientHeight)) + "px";
  536. dom.className = "sign-img mark";
  537. };
  538. // 鼠标抬开
  539. document.onmouseup = e => {
  540. let left = (this.getPos(e).x + this.$refs.pdfBox.scrollLeft - parseInt(dom.clientWidth / 2) - document.querySelector(".pdf-box").offsetLeft - sidebarWidth);
  541. let top = (this.getPos(e).y + this.scrollTop - parseInt(dom.clientHeight / 2) - 100);
  542. if(this.showEdges) {
  543. //限制区域
  544. if (left < document.querySelector(".pdf-box").clientWidth) {
  545. document.onmousemove = null;
  546. document.onmouseup = null;
  547. document.querySelector("#pageContent").removeChild(dom);
  548. this.$message.error("请将印章拖拽到合同区域");
  549. return;
  550. } else if (left > (document.querySelector(".pdf-box").clientWidth + 120*this.scale) - (100 * this.scale)) {
  551. document.onmousemove = null;
  552. document.onmouseup = null;
  553. document.querySelector("#pageContent").removeChild(dom);
  554. this.$message.error("印章位置超出了合同区域");
  555. return;
  556. }
  557. if (top < 0) {
  558. document.onmousemove = null;
  559. document.onmouseup = null;
  560. document.querySelector("#pageContent").removeChild(dom);
  561. this.$message.error("请将印章拖拽到合同区域");
  562. return;
  563. } else if (top > document.querySelector(".pdf-box").clientHeight - (100 * this.scale)) {
  564. document.onmousemove = null;
  565. document.onmouseup = null;
  566. document.querySelector("#pageContent").removeChild(dom);
  567. this.$message.error("印章位置超出了合同区域");
  568. return;
  569. }
  570. }else {
  571. //限制区域
  572. if (left < 0) {
  573. document.onmousemove = null;
  574. document.onmouseup = null;
  575. document.querySelector("#pageContent").removeChild(dom);
  576. this.$message.error("请将印章拖拽到合同区域");
  577. return;
  578. } else if (left > document.querySelector(".pdf-box").clientWidth - (100 * this.scale)) {
  579. document.onmousemove = null;
  580. document.onmouseup = null;
  581. document.querySelector("#pageContent").removeChild(dom);
  582. this.$message.error("印章位置超出了合同区域");
  583. return;
  584. }
  585. if (top < 0) {
  586. document.onmousemove = null;
  587. document.onmouseup = null;
  588. document.querySelector("#pageContent").removeChild(dom);
  589. this.$message.error("请将印章拖拽到合同区域");
  590. return;
  591. } else if (top > document.querySelector(".pdf-box").clientHeight - (100 * this.scale)) {
  592. document.onmousemove = null;
  593. document.onmouseup = null;
  594. document.querySelector("#pageContent").removeChild(dom);
  595. this.$message.error("印章位置超出了合同区域");
  596. return;
  597. }
  598. }
  599. let index = 0;
  600. if(top > this.pdfHeight*this.page_num){
  601. top = top - this.pdfHeight*this.page_num;
  602. index = this.page_num+1;
  603. }else {
  604. top = top - this.pdfHeight*(this.page_num-1);
  605. index = this.page_num;
  606. }
  607. // margin
  608. top = top - (index-1)*10;
  609. this.posPage = index;
  610. this.seal_id = dom.getAttribute("id");
  611. document.querySelector("#pageContent").removeChild(dom);
  612. if(this.showEdges) {
  613. this.pos_x = left-this.pdfWidth;
  614. this.pos_y = top;
  615. dom.style.left = left-this.pdfWidth + "px";
  616. dom.style.top = top + "px";
  617. dom.style.height = 100 * this.scale + "px";
  618. dom.style.width = 100 * this.scale + "px";
  619. document.onmousemove = null;
  620. document.onmouseup = null;
  621. for(let i=1;i<=this.page_count;i++){
  622. let domNum = dom.cloneNode(true);
  623. document.querySelector('#edge_'+ i).appendChild(domNum);
  624. domNum.className = "sign-img mark slide-sign";
  625. domNum.onmousedown = this.moveTo2;
  626. domNum.onmouseenter = this.mouseenter;
  627. domNum.onmouseleave = this.mouseleave;
  628. domNum.childNodes[0].onclick = this.deleteIt2;
  629. }
  630. this.signEdges = false;
  631. }else {
  632. for (let i = 0; i < document.querySelectorAll('.text_mark2').length; i++) {
  633. if(document.querySelectorAll('.text_mark2')[i].getAttribute('role_id') == this.user_role_id){
  634. this.pos_x = parseInt(document.querySelectorAll('.text_mark2')[i].style.left);
  635. this.pos_y = parseInt(document.querySelectorAll('.text_mark2')[i].style.top);
  636. this.posPage = document.querySelectorAll('.text_mark2')[i].getAttribute('page');
  637. dom.style.left = 0 + "px";
  638. dom.style.top = 0 + "px";
  639. dom.style.height = 100 * this.scale + "px";
  640. dom.style.width = 100 * this.scale + "px";
  641. document.querySelectorAll('.text_mark2')[i].childNodes[1].childNodes[0].style.display = 'none';
  642. document.querySelectorAll('.text_mark2')[i].childNodes[1].appendChild(dom);
  643. document.onmousemove = null;
  644. document.onmouseup = null;
  645. dom.onmouseenter = this.mouseenter;
  646. dom.onmouseleave = this.mouseleave;
  647. dom.childNodes[0].onclick = this.deleteIt3;
  648. this.setFlag = true;
  649. }
  650. }
  651. if(!this.setFlag){
  652. this.pos_x = left;
  653. this.pos_y = top;
  654. dom.style.left = left + "px";
  655. dom.style.top = top + "px";
  656. dom.style.height = 100 * this.scale + "px";
  657. dom.style.width = 100 * this.scale + "px";
  658. document.querySelector('#can'+ index).appendChild(dom);
  659. document.onmousemove = null;
  660. document.onmouseup = null;
  661. dom.onmouseenter = this.mouseenter;
  662. dom.onmouseleave = this.mouseleave;
  663. dom.onmousedown = this.moveTo;
  664. dom.childNodes[0].onclick = this.deleteIt;
  665. }
  666. }
  667. };
  668. },
  669. moveTo(e) {
  670. let odiv = e.currentTarget; //获取目标元素
  671. //算出鼠标相对元素的位置
  672. let disX = e.clientX - odiv.offsetLeft;
  673. let disY = e.clientY - odiv.offsetTop;
  674. document.onmousemove = e => {
  675. let left = e.clientX - disX;
  676. let top = e.clientY - disY;
  677. //限制区域
  678. if (left <= 0) {
  679. left = 0;
  680. } else if (left >= document.querySelector(".pdf-box").clientWidth - odiv.clientWidth) {
  681. left = document.querySelector(".pdf-box").clientWidth - odiv.clientWidth;
  682. }
  683. if (top <= 0) {
  684. top = 0;
  685. } else if (top >= this.pdfHeight - odiv.clientHeight) {
  686. top = this.pdfHeight - odiv.clientHeight;
  687. }
  688. //移动当前元素
  689. this.pos_x = left;
  690. this.pos_y = top;
  691. // console.log(this.pos_x,this.pos_y)
  692. odiv.style.left = left + "px";
  693. odiv.style.top = top + "px";
  694. };
  695. document.onmouseup = e => {
  696. document.onmousemove = null;
  697. document.onmouseup = null;
  698. };
  699. },
  700. moveTo2(e) {
  701. let odiv = e.currentTarget; //获取目标元素
  702. //算出鼠标相对元素的位置
  703. let disX = e.clientX - odiv.offsetLeft;
  704. let disY = e.clientY - odiv.offsetTop;
  705. document.onmousemove = e => {
  706. let left = e.clientX - disX;
  707. let top = e.clientY - disY;
  708. //限制区域
  709. if (left <= 0) {
  710. left = 0;
  711. } else if (left >= 120*this.scale - odiv.clientWidth) {
  712. left = 120*this.scale - odiv.clientWidth;
  713. }
  714. if (top <= 0) {
  715. top = 0;
  716. } else if (top >= this.pdfHeight - odiv.clientHeight) {
  717. top = this.pdfHeight - odiv.clientHeight;
  718. }
  719. //移动当前元素
  720. this.pos_x = left;
  721. this.pos_y = top;
  722. odiv.style.left = left + "px";
  723. odiv.style.top = top + "px";
  724. };
  725. document.onmouseup = e => {
  726. document.querySelectorAll(".slide-sign").forEach((item) => {
  727. item.style.left = odiv.style.left;
  728. item.style.top = odiv.style.top;
  729. });
  730. document.onmousemove = null;
  731. document.onmouseup = null;
  732. };
  733. },
  734. getPos(ev) {
  735. return { x: ev.clientX, y: ev.clientY };
  736. },
  737. toAddSeal() {
  738. window.open(this.fun.getSiteRoot() + "/#/seal/index");
  739. // this.$router.push(this.fun.getUrl("sealIndex"));
  740. },
  741. // tab点击事件
  742. handleClick(tab, event) {
  743. //console.log(this.activeName,"activeName")
  744. },
  745. handleChange(val) {
  746. this.scale = val;
  747. this.queueRenderPage(this.pageNum);
  748. },
  749. handleScroll(el) {
  750. this.scrollTop = this.$refs.pdfBox.scrollTop;
  751. let _pdfs = document.querySelectorAll(".pdfPage_1yRne");
  752. let arr = [];
  753. _pdfs.forEach((item, index) => {
  754. if (this.scrollTop >= item.offsetTop) {
  755. arr.push(index);
  756. }
  757. });
  758. this.page_num = Math.max.apply(null, arr) + 1;
  759. },
  760. jump() {
  761. let that = this;
  762. let index = this.page_num - 1;
  763. if (index > this.page_count) {
  764. this.$message.error("请输入有效范围内的数字");
  765. return;
  766. }
  767. // 用 class="pdfPage_1yRne" 添加锚点
  768. let jump = document.querySelectorAll(".pdfPage_1yRne");
  769. let total = jump[index].offsetTop;
  770. // console.log('纵坐标', total)
  771. let distance = this.scrollTop;
  772. //平滑滚动,时长500ms,每10ms一跳,共50跳
  773. let step = total / 30 >> 0;
  774. if (total > distance) {
  775. smoothDown();
  776. } else {
  777. let newTotal = distance - total;
  778. step = newTotal / 30 >> 0;
  779. smoothUp();
  780. }
  781. function smoothDown() {
  782. if (distance < total) {
  783. distance += step;
  784. that.$refs.pdfBox.scrollTop = distance;
  785. setTimeout(smoothDown, 10);
  786. } else {
  787. that.$refs.pdfBox.scrollTop = total;
  788. }
  789. }
  790. function smoothUp() {
  791. if (distance > total) {
  792. distance -= step;
  793. that.$refs.pdfBox.scrollTop = distance;
  794. setTimeout(smoothUp, 10);
  795. } else {
  796. that.$refs.pdfBox.scrollTop = total;
  797. }
  798. }
  799. },
  800. _renderPage(num) {
  801. this.pdfDoc.getPage(num).then((page) => {
  802. let canvas = document.getElementById("the-canvas" + num);
  803. let ctx = canvas.getContext("2d");
  804. let viewport = page.getViewport(this.scale);
  805. // alert(vm.canvas.height)
  806. this.pdfHeight = canvas.height = viewport.height;
  807. this.pdfWidth = canvas.width = viewport.width;
  808. // Render PDF page into canvas context
  809. let renderContext = {
  810. canvasContext: ctx,
  811. viewport: viewport
  812. };
  813. page.render(renderContext).then(()=>{
  814. let c = document.getElementById("the-canvas"+ num);
  815. let base64img = c.toDataURL("image/png");
  816. const img = document.createElement('img');
  817. img.src = base64img;
  818. img.style.width = viewport.width;
  819. document.getElementById("sun").appendChild(img)
  820. document.getElementById("the-canvas"+ num).remove();
  821. }).then(()=>{
  822. if (this.page_count > num) {
  823. this._renderPage(num + 1);
  824. }
  825. });
  826. })
  827. this.page_num = this.pageNum;
  828. },
  829. _loadFile(url) {
  830. const CMAP_URL = 'https://cdn.jsdelivr.net/npm/pdfjs-dist@2.0.943/cmaps/';
  831. pdfjsLib.getDocument({url:url,cMapUrl: CMAP_URL,cMapPacked: true,disableWorker: true}).then((pdf) => {
  832. this.pdfDoc = pdf;
  833. this.page_count = this.pdfDoc.numPages;
  834. this.$nextTick(() => {
  835. this.setTemplate();
  836. this.isShow = true;
  837. this._renderPage(1);
  838. });
  839. this.pageNum = 1;
  840. });
  841. },
  842. queueRenderPage(num) {
  843. this._renderPage(num);
  844. }
  845. }
  846. })
  847. </script>
  848. <style>
  849. .slide-fade-enter-active {
  850. transition: all 0.3s ease;
  851. }
  852. .slide-fade-leave-active {
  853. transition: all 0.3s cubic-bezier(1, 0.5, 0.8, 1);
  854. }
  855. .slide-fade-enter, .slide-fade-leave-to {
  856. transform: translateX(-10px);
  857. opacity: 0;
  858. }
  859. .dialog-box .phone {
  860. width: 430px;
  861. margin: 0 auto;
  862. text-align: left;
  863. font-size: 16px;
  864. }
  865. .dialog-box .send-code {
  866. display: flex;
  867. width: 450px;
  868. margin: 30px auto;
  869. }
  870. .dialog-box .code-title {
  871. flex: 0 0 100px;
  872. align-self: center;
  873. }
  874. .pageContent_2lAGg {
  875. display: flex;
  876. /*max-width: 1200px;*/
  877. height: 93vh;
  878. /*margin: 10px auto 0 auto;*/
  879. overflow: auto;
  880. user-select: none;
  881. /*firefox浏览器*/
  882. -moz-user-select: none;
  883. /*safari、chrome浏览器*/
  884. -webkit-user-select: none;
  885. /*Safari中不支持该属性值,只能使用none或者text,或者是在html的标签属性中使用*/
  886. }
  887. .pageContent_2lAGg .input {
  888. border: none;
  889. outline: none;
  890. width: 170px;
  891. }
  892. .pageContent_2lAGg .sign-img {
  893. position: absolute;
  894. cursor: move;
  895. z-index: 7;
  896. background-repeat: no-repeat;
  897. background-size: cover;
  898. background-image: url("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1584116150977&di=8c196ff505f980e30039a8794ead2dad&imgtype=0&src=http%3A%2F%2Fbpic.588ku.com%2Felement_origin_min_pic%2F20%2F16%2F01%2F3156adf74e970a9.jpg");
  899. }
  900. .pageContent_2lAGg .componentSign {
  901. display: none;
  902. flex-direction: row;
  903. justify-content: space-between;
  904. align-items: center;
  905. width: 100px;
  906. height: 100px;
  907. padding: 0 10px;
  908. border: 1px dashed rgba(0, 0, 0, 0.3);
  909. background: rgba(255, 255, 255, 0.85);
  910. font-size: 12px;
  911. position: absolute;
  912. top: 95px;
  913. left: 56px;
  914. }
  915. .pageContent_2lAGg .sealCompInfo_3v9iQ {
  916. min-width: 100%;
  917. position: absolute;
  918. height: 20px;
  919. top: -21px;
  920. left: -1px;
  921. padding: 4px 8px;
  922. white-space: nowrap;
  923. text-align: center;
  924. color: #fff;
  925. font-size: 12px;
  926. background: rgba(92, 162, 232, 0.6);
  927. z-index: 6;
  928. display: none;
  929. }
  930. .pageContent_2lAGg .sealCompInfo_3v9iQ .need {
  931. font-size: 16px;
  932. margin-top: 2px;
  933. margin-right: 4px;
  934. display: inline-block;
  935. }
  936. .pageContent_2lAGg .itemConentStyle_2MWEL {
  937. position: absolute;
  938. top: 0;
  939. left: 0;
  940. bottom: 0;
  941. right: 0;
  942. }
  943. .pageContent_2lAGg .infoMsg_3NkPg {
  944. position: absolute;
  945. top: 41px;
  946. width: 100%;
  947. text-align: center;
  948. }
  949. .pageContent_2lAGg .componentSign-show {
  950. display: flex;
  951. flex-direction: row;
  952. justify-content: space-between;
  953. align-items: center;
  954. width: 190px;
  955. height: 28px;
  956. padding: 0 10px;
  957. border: 1px dashed rgba(0, 0, 0, 0.3);
  958. background: rgba(255, 255, 255, 0.85);
  959. font-size: 12px;
  960. cursor: grab;
  961. position: absolute;
  962. top: 95px;
  963. left: 12px;
  964. }
  965. .pageContent_2lAGg .componentSign-img {
  966. display: none;
  967. width: 100px;
  968. height: 100px;
  969. }
  970. .pageContent_2lAGg .delete {
  971. width: 100%;
  972. position: absolute;
  973. bottom: -15px;
  974. text-align: center;
  975. color: #fff;
  976. font-size: 15px;
  977. background-color: rgba(10, 10, 10, 0.6);
  978. cursor: pointer;
  979. display: none;
  980. }
  981. .pageContent_2lAGg .componentArea {
  982. display: none;
  983. flex-direction: row;
  984. justify-content: space-between;
  985. align-items: center;
  986. width: 190px;
  987. height: 28px;
  988. margin: 8px auto;
  989. padding: 0 10px;
  990. background: rgba(255, 255, 255, 0.85);
  991. border: 1px solid #409EFF;
  992. font-size: 12px;
  993. /*cursor: grab;*/
  994. position: absolute;
  995. top: 90px;
  996. left: 12px;
  997. }
  998. .pageContent_2lAGg .itemConentStyle {
  999. position: absolute;
  1000. height: 20px;
  1001. top: -21px;
  1002. left: -1px;
  1003. padding: 4px 8px;
  1004. white-space: nowrap;
  1005. text-align: center;
  1006. color: #fff;
  1007. font-size: 12px;
  1008. background: rgba(92, 162, 232, 0.8);
  1009. z-index: 10;
  1010. display: none;
  1011. }
  1012. .pageContent_2lAGg .itemConentStyle .need {
  1013. font-size: 16px;
  1014. margin-top: 2px;
  1015. margin-right: 4px;
  1016. display: inline-block;
  1017. }
  1018. .pageContent_2lAGg .text_delete {
  1019. width: 40%;
  1020. position: absolute;
  1021. bottom: -19px;
  1022. left: 30%;
  1023. text-align: center;
  1024. color: #fff;
  1025. padding: 3px 0;
  1026. font-size: 12px;
  1027. background-color: rgba(10, 10, 10, 0.6);
  1028. cursor: pointer;
  1029. display: none;
  1030. }
  1031. .pageContent_2lAGg .icon-pm_auction_success {
  1032. color: #409EFF;
  1033. display: none;
  1034. }
  1035. .pageContent_2lAGg .choose {
  1036. border: 1px solid #409EFF;
  1037. }
  1038. .pageContent_2lAGg .choose .icon-pm_auction_success {
  1039. display: inline-block;
  1040. }
  1041. .pageContent_2lAGg .needFill {
  1042. border: 1px solid #e61717;
  1043. -webkit-appearance: none;
  1044. }
  1045. .pageContent_2lAGg .errorInfo_3lZie {
  1046. display: none;
  1047. position: absolute;
  1048. left: 0;
  1049. bottom: -16px;
  1050. z-index: 10;
  1051. justify-content: flex-start;
  1052. align-items: center;
  1053. width: 100%;
  1054. height: 14px;
  1055. color: #e61717;
  1056. font-size: 12px;
  1057. line-height: 18px;
  1058. white-space: nowrap;
  1059. }
  1060. .leftContent_2NoKi {
  1061. display: flex;
  1062. flex-direction: column;
  1063. flex: 0 0 240px;
  1064. width: 240px;
  1065. height: 100%;
  1066. }
  1067. .leftContent_2NoKi .doc-list-title {
  1068. font-size: 14px;
  1069. font-weight: 800;
  1070. color: #333;
  1071. line-height: 40px;
  1072. height: 40px;
  1073. width: 100%;
  1074. /*border-bottom: 1px solid #eaeaea;*/
  1075. }
  1076. .leftContent_2NoKi .doc-list-title span {
  1077. color: #777;
  1078. font-size: 12px;
  1079. line-height: 40px;
  1080. font-weight: normal;
  1081. }
  1082. .leftContent_2NoKi .doc-list-context {
  1083. height: 100%;
  1084. width: 240px;
  1085. display: inline-block;
  1086. padding: 0 15px;
  1087. }
  1088. .leftContent_2NoKi .doc-list {
  1089. overflow-y: auto;
  1090. width: 100%;
  1091. height: calc(100% - 100px);
  1092. }
  1093. .leftContent_2NoKi .doc-list::-webkit-scrollbar {
  1094. display: none;
  1095. }
  1096. .leftContent_2NoKi .doc-item {
  1097. margin: 0;
  1098. padding: 20px 45px 0 45px;
  1099. cursor: pointer;
  1100. }
  1101. .leftContent_2NoKi .doc-img {
  1102. border: 1px solid #333;
  1103. position: relative;
  1104. width: 121px;
  1105. height: 161px;
  1106. margin-bottom: 5px;
  1107. }
  1108. .leftContent_2NoKi .doc-img img {
  1109. width: 100%;
  1110. height: 100%;
  1111. }
  1112. .leftContent_2NoKi .doc-page-num {
  1113. z-index: 100;
  1114. position: absolute;
  1115. bottom: 0;
  1116. right: 0;
  1117. width: 20px;
  1118. height: 20px;
  1119. line-height: 20px;
  1120. font-size: 12px;
  1121. text-align: center;
  1122. background-color: #333333;
  1123. color: #fff;
  1124. }
  1125. .leftContent_2NoKi .doc-name {
  1126. color: #333;
  1127. font-size: 12px;
  1128. line-height: 20px;
  1129. word-break: break-all;
  1130. }
  1131. .leftContent_2NoKi .componentsList_1OIrB {
  1132. display: flex;
  1133. flex-direction: column;
  1134. align-items: flex-start;
  1135. width: 100%;
  1136. margin-top: 50px;
  1137. position: relative;
  1138. }
  1139. .leftContent_2NoKi .title_3vpva {
  1140. font-size: 14px;
  1141. font-weight: 500;
  1142. line-height: 22px;
  1143. padding-left: 16px;
  1144. margin-bottom: 4px;
  1145. }
  1146. .leftContent_2NoKi .tips_2oKGU {
  1147. margin: 0 14px;
  1148. font-size: 12px;
  1149. line-height: 20px;
  1150. color: #999;
  1151. vertical-align: baseline;
  1152. }
  1153. .pdfContent_1PW2f {
  1154. flex: 1;
  1155. display: flex;
  1156. flex-direction: column;
  1157. height: 100%;
  1158. overflow: auto;
  1159. background: #f5f5f5;
  1160. }
  1161. .pdfContent_1PW2f .pdf-header {
  1162. /*position: fixed;*/
  1163. top: 55px;
  1164. left: 240px;
  1165. right: 240px;
  1166. height: 40px;
  1167. border-bottom: 1px solid #eee;
  1168. background-color: #fff;
  1169. z-index: 100;
  1170. text-align: center;
  1171. display: flex;
  1172. }
  1173. .pdfContent_1PW2f .pdf-header .block {
  1174. flex: 1;
  1175. display: flex;
  1176. }
  1177. .pdfContent_1PW2f .pdf-header .block .demonstration, .pdfContent_1PW2f .pdf-header .block .slider {
  1178. flex: 0 0 150px;
  1179. line-height: 40px;
  1180. width: 150px;
  1181. text-align: right;
  1182. }
  1183. .pdfContent_1PW2f .pdf-header .block .demonstration {
  1184. flex: 1;
  1185. margin-right: 20px;
  1186. }
  1187. .pdfContent_1PW2f .pdf-header .input {
  1188. flex: 1;
  1189. text-align: left;
  1190. line-height: 40px;
  1191. margin-left: 20px;
  1192. }
  1193. .pdfContent_1PW2f .pdf-header .input .input-text {
  1194. border: none;
  1195. outline: none;
  1196. border-bottom: 1px solid #e4e7ed;
  1197. margin-left: 10px;
  1198. width: 25px;
  1199. text-align: center;
  1200. }
  1201. .pdfContent_1PW2f .pdf-container {
  1202. display: inline-block;
  1203. overflow: auto;
  1204. height: 100%;
  1205. width: 100%;
  1206. }
  1207. .pdfContent_1PW2f .pdf-container .pdf-box {
  1208. position: relative;
  1209. margin: 0 auto;
  1210. }
  1211. .pdfContent_1PW2f .pdf-container .pdf-box .sign-img {
  1212. z-index: 4;
  1213. }
  1214. .pdfContent_1PW2f .pdf-container .bottom-btn {
  1215. line-height: 0;
  1216. width: 36px;
  1217. border-radius: 26px;
  1218. position: fixed;
  1219. bottom: 50px;
  1220. right: 290px;
  1221. height: 100px;
  1222. letter-spacing: 3px;
  1223. background-color: rgba(0, 0, 0, 0.6);
  1224. color: #fff;
  1225. font-size: 14px;
  1226. z-index: 100;
  1227. border: none;
  1228. cursor: pointer;
  1229. text-align: center;
  1230. padding-top: 17px;
  1231. }
  1232. .pdfContent_1PW2f .pdf-container .bottom-btn span {
  1233. writing-mode: vertical-rl;
  1234. }
  1235. .pdfContent_1PW2f .pdfPage_1yRne {
  1236. /*transition: left .3s;*/
  1237. position: relative;
  1238. margin: 10px 0;
  1239. }
  1240. .pdfContent_1PW2f .es-pdf-page__edges {
  1241. /*transition: width .3s;*/
  1242. position: absolute;
  1243. top: 0;
  1244. left: 99.5%;
  1245. user-select: none;
  1246. z-index: 0;
  1247. background: url("../../assets/images/page.png");
  1248. background-size: cover;
  1249. }
  1250. .pdfContent_1PW2f .es-pdf-page__edges--visible {
  1251. border: 2px dashed #2981d9;
  1252. }
  1253. .pdfContent_1PW2f .dragLayer_3ccsq {
  1254. position: absolute;
  1255. left: 0;
  1256. top: 0;
  1257. right: 0;
  1258. bottom: 0;
  1259. }
  1260. .taskInfoArea_3ThxW {
  1261. display: flex;
  1262. flex-direction: column;
  1263. flex: 0 0 270px;
  1264. width: 270px;
  1265. height: 100%;
  1266. }
  1267. .taskInfoArea_3ThxW .tab-bar {
  1268. width: 100%;
  1269. padding: 0 15px;
  1270. height: 40px;
  1271. font-size: 14px;
  1272. line-height: 38px;
  1273. display: flex;
  1274. border-bottom: 1px solid #eaeaea;
  1275. color: #999;
  1276. overflow: hidden;
  1277. justify-content: space-around;
  1278. }
  1279. .taskInfoArea_3ThxW .tab-context {
  1280. /*padding: 0 15px;*/
  1281. height: calc(100% - 51px);
  1282. overflow-y: auto;
  1283. overflow-x: hidden;
  1284. text-align: center;
  1285. font-weight: bold;
  1286. }
  1287. .taskInfoArea_3ThxW .real .gray {
  1288. color: #999999;
  1289. font-weight: normal;
  1290. margin: 10px 0;
  1291. display: block;
  1292. }
  1293. .taskInfoArea_3ThxW .item {
  1294. margin-top: 25px;
  1295. }
  1296. .taskInfoArea_3ThxW .title {
  1297. margin: 10px 0;
  1298. }
  1299. .taskInfoArea_3ThxW .seal-box-wrap {
  1300. display: flex;
  1301. flex-wrap: wrap;
  1302. margin: 0 5px;
  1303. }
  1304. .taskInfoArea_3ThxW .fileAddItem_1Vqb7 {
  1305. flex-direction: column;
  1306. justify-content: center;
  1307. height: 120px;
  1308. width: 110px;
  1309. margin: 0 5px 10px 5px;
  1310. border: 1px solid #e6e6e6;
  1311. cursor: pointer;
  1312. vertical-align: bottom;
  1313. display: flex;
  1314. align-items: center;
  1315. }
  1316. .taskInfoArea_3ThxW .fileAddItem_1Vqb7 .defaultInfoStyle_2mgdq {
  1317. font-size: 14px;
  1318. color: #777;
  1319. }
  1320. .taskInfoArea_3ThxW .fileAddItem_1Vqb7 i {
  1321. font-weight: normal;
  1322. font-size: 30px;
  1323. color: #777;
  1324. }
  1325. .taskInfoArea_3ThxW .fileAddItem_1Vqb7:hover {
  1326. border: 1px solid #409EFF;
  1327. background-color: rgba(64, 158, 255, 0.07);
  1328. }
  1329. .taskInfoArea_3ThxW .fileAddItem_1Vqb7:hover .defaultInfoStyle_2mgdq {
  1330. color: #409EFF;
  1331. }
  1332. .taskInfoArea_3ThxW .fileAddItem_1Vqb7:hover i {
  1333. color: #409EFF;
  1334. }
  1335. .taskInfoArea_3ThxW .seal-box {
  1336. margin: 5px 0;
  1337. }
  1338. .taskInfoArea_3ThxW .seal-wrapper-item {
  1339. position: relative;
  1340. padding: 10px 5px;
  1341. margin: 0 5px;
  1342. height: 120px;
  1343. width: 110px;
  1344. cursor: move;
  1345. border: 1px dotted #e1e1e1;
  1346. }
  1347. .taskInfoArea_3ThxW .seal-box-title {
  1348. width: 110px;
  1349. margin: 10px 0;
  1350. font-size: 13px;
  1351. font-weight: normal;
  1352. color: #999999;
  1353. }
  1354. .taskInfoArea_3ThxW .finish-img {
  1355. width: 100px;
  1356. height: 100px;
  1357. }
  1358. .taskInfoArea_3ThxW .item-box {
  1359. width: 100%;
  1360. margin-bottom: 20px;
  1361. }
  1362. .taskInfoArea_3ThxW .testSetting_8FNRp {
  1363. width: 100%;
  1364. display: flex;
  1365. flex-direction: column;
  1366. justify-content: flex-start;
  1367. align-items: flex-start;
  1368. text-align: left;
  1369. }
  1370. .taskInfoArea_3ThxW .titleh2_3zdht {
  1371. margin-bottom: 5px;
  1372. font-size: 12px;
  1373. font-weight: 500;
  1374. line-height: 22px;
  1375. color: #333;
  1376. }
  1377. .taskInfoArea_3ThxW .emptyStyle_wctx0 {
  1378. display: flex;
  1379. flex-direction: column;
  1380. justify-content: flex-start;
  1381. align-items: center;
  1382. width: 100%;
  1383. margin-top: 200px;
  1384. }
  1385. .taskInfoArea_3ThxW .emptyP_2N3sX {
  1386. width: 196px;
  1387. font-size: 13px;
  1388. color: #333;
  1389. line-height: 22px;
  1390. font-weight: 500;
  1391. text-align: center;
  1392. }
  1393. .taskInfoArea_3ThxW .sign-flow-info {
  1394. padding: 25px 10px 0 15px;
  1395. }
  1396. .taskInfoArea_3ThxW .sign-flow-info-detail {
  1397. margin-bottom: 3px;
  1398. text-align: left;
  1399. }
  1400. .taskInfoArea_3ThxW .detail-item {
  1401. margin-bottom: 15px;
  1402. }
  1403. .taskInfoArea_3ThxW .detail-item-title {
  1404. color: #777;
  1405. height: 20px;
  1406. line-height: 20px;
  1407. font-size: 13px;
  1408. font-weight: 400;
  1409. }
  1410. .taskInfoArea_3ThxW .detail-item-desc {
  1411. color: #333;
  1412. line-height: 20px;
  1413. width: 100%;
  1414. font-size: 13px;
  1415. display: inline-block;
  1416. }
  1417. .taskInfoArea_3ThxW .wrap {
  1418. word-wrap: break-word;
  1419. word-break: break-all;
  1420. }
  1421. .taskInfoArea_3ThxW .userItem {
  1422. padding: 12px 0 0 0;
  1423. display: flex;
  1424. font-weight: normal;
  1425. color: #333333;
  1426. }
  1427. .taskInfoArea_3ThxW .user {
  1428. background-color: #0099e6;
  1429. flex: 0 0 40px;
  1430. height: 40px;
  1431. color: #fff;
  1432. font-size: 16px;
  1433. display: flex;
  1434. justify-content: center;
  1435. align-items: center;
  1436. border-radius: 8px;
  1437. line-height: 30px;
  1438. }
  1439. .taskInfoArea_3ThxW .user-name {
  1440. display: flex;
  1441. flex-direction: column;
  1442. text-align: left;
  1443. margin-left: 10px;
  1444. font-size: 12px;
  1445. align-self: center;
  1446. }
  1447. .taskInfoArea_3ThxW .tag {
  1448. flex: 0 0 72px;
  1449. font-size: 12px;
  1450. display: flex;
  1451. justify-content: center;
  1452. align-items: center;
  1453. }
  1454. .taskInfoArea_3ThxW .tag span {
  1455. background-color: #0099e6;
  1456. color: #fff;
  1457. padding: 3px 6px;
  1458. border-radius: 10px;
  1459. }
  1460. .taskInfoArea_3ThxW .tag .icon-all_link {
  1461. cursor: pointer;
  1462. margin-left: 3px;
  1463. color: #0099e6;
  1464. font-size: 16px;
  1465. }
  1466. .taskInfoArea_3ThxW .block {
  1467. margin-top: 20px;
  1468. }
  1469. </style>
  1470. @endsection