|  | @@ -19,6 +19,7 @@ const ledgerCheckType = {
 | 
	
		
			
				|  |  |      tp: {value: 5, text: '清单金额≠数量×单价', fun: 'checkTp', },
 | 
	
		
			
				|  |  |      over: {value: 6, text: '超计', fun: 'checkOver', },
 | 
	
		
			
				|  |  |      same_code: {value: 7, text: '重复项目节', fun: 'checkSameCode', },
 | 
	
		
			
				|  |  | +    same_bills: {value: 14, text: '重复清单(同部位)', fun: 'checkSameBwBills', },
 | 
	
		
			
				|  |  |      limit3f: {
 | 
	
		
			
				|  |  |          fun: 'check3fLimit', items: [
 | 
	
		
			
				|  |  |              { value: 8, text: '违规计量(工序报验)', key: 'gxbyOver', type: 'gxby', },
 | 
	
	
		
			
				|  | @@ -183,6 +184,33 @@ const ledgerCheckUtil = {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          return error;
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  | +    checkSameBwBills: function(ledgerTree, ledgerPos, decimal, option) {
 | 
	
		
			
				|  |  | +        const error = [];
 | 
	
		
			
				|  |  | +        for (const node of ledgerTree.nodes) {
 | 
	
		
			
				|  |  | +            if (!node.children || node.children.length === 0) continue;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            const gatherGcl = [];
 | 
	
		
			
				|  |  | +            for (const child of node.children) {
 | 
	
		
			
				|  |  | +                if (!child.b_code) continue;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                let gcl = gatherGcl.find(g => {
 | 
	
		
			
				|  |  | +                    return g.b_code === child.b_code &&
 | 
	
		
			
				|  |  | +                        (g.name || child.name ? g.name === child.name : true) &&
 | 
	
		
			
				|  |  | +                        (g.unit || child.unit ? g.unit === child.unit : true) &&
 | 
	
		
			
				|  |  | +                        checkZero(ZhCalc.sub(g.unit_price, child.unit_price));
 | 
	
		
			
				|  |  | +                });
 | 
	
		
			
				|  |  | +                if (!gcl) {
 | 
	
		
			
				|  |  | +                    gcl = { source: [], b_code: child.b_code || '', name: child.name || '', unit: child.unit || '', unit_price: child.unit_price || 0 }
 | 
	
		
			
				|  |  | +                    gatherGcl.push(gcl);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                gcl.source.push(child);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            gatherGcl.forEach(g => {
 | 
	
		
			
				|  |  | +                if (g.source.length > 1) error.push(...g.source);
 | 
	
		
			
				|  |  | +            })
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return error;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  |      check3fLimit: function (ledgerTree, ledgerPos, decimal, option) {
 | 
	
		
			
				|  |  |          const error = {};
 | 
	
		
			
				|  |  |          for (const i of ledgerCheckType.limit3f.items) {
 |