leafcxy


  • 首页

  • 归档

  • 标签

erp中三大订单CO、PO、MO各是代表什么

发表于 2023-08-29 14:48:53
字数统计 4962

ERP即 企业资源计划 (Enterprise Resource Planning),由美国 Gartner Group 公司于1990年提出。   ERP系统是指建立在信息技术基础上,以系统化的管理思想,为企业决策层及员工提供决策运行手段的管理平台。   ERP中三大订单CO、PO、MO的意思分别如下:   CO:客户订单,或销售订单   PO:采购订单   MO:生产订单

ERP—企业资源计划(Enterprise Resource Planning). []

20 世纪90 年代MRP-II 发展到了一个新的阶段:ERP(EnterpriseResourcePlanning—企业资源计划)

企业的所有资源简要地说包括三大流:物流、资金流、信息流,ERP 也就是对这三种资源进行全面集成管理的管理信息系统。概括地说,ERP 是建立在信息技术基础上,利用现代企业的先进管理思想,全面地集成了企业所有资源信息,为企业提供决策、计划、控制与经营业绩评估的全方位和系统化的管理平台。

MRPⅡ—制造资源计划(Manufacturing Resource Planning). []

1977 年9 月,由美国著名生产管理专家奥列弗·怀特(Oliver W·Wight )提出了一个新概念——制造资源计划(Manufacturing Resources Planning),称为MRP-II 。

MRP-II 是对制造业企业资源进行有效计划的一整套方法。它是一个围绕企业的基本经营目标,以生产计划为主线,对企业制造的各种资源进行统一的计划和控制,使企业的物流、信息流、资金流流动畅通的动态反馈系统。MRP—物料需求计划(Material Requirements Planning). [?]

20 世纪60 年代,IBM 公司的约瑟夫·奥利佛博士提出了把对物料的需求分为独立需求与相关需求的概念:产品结构中物料的需求量是相关的。

2在需要的时候

2提供需要的数量

MPS—主生产计划(Master Production schedules). [??]

主生产计划(Master Production Schedule ,简称MPS )是确定每一具体的最终产品在每一具体时间段内生产数量的计划。这里的最终产品是指对于企业来说最终完成、要出厂的完成品,它要具体到产品的品种、型号。这里的具体时间段,通常是以周为单位,在有些情况下,也可以是日、旬、月。

通常主生产计划是根据客户合同(订单)和市场预测,把经营计划或生产大纲中的产品系列具体化,使之成为展开物料需求计划的主要依据,起到了从综合计划向具体计划过渡的承上启下作用。MPS 最终将可作为生产部门执行的目标,并成为考核工厂服务水准的依据。在MRP 系统中,主生产计划是作为驱动的一整套计划数据,反映企业打算生产什么,什么时候生产以及生产多少。主生产计划必须考虑客户订单和预测、未完成订单、可用物料的数量、现有能力、管理方针和目标等等。

MTO—订货生产(Make-to-Order).

如特殊医疗器械、模具等生产企业,当最终产品和主要的部件、组件都是顾客订货的特殊产品时,这些最终产品和主要部件、组件的种类比它们所需的主要原材料和基本零件的数量可能要多得多。在这种情况下,类似于组装生产,主生产计划(MPS )也可能是以主要原材料和基本零件为对象来制定的。

MTS—备货生产(Make-to-Stock). 其中的最终产品是对于企业来说最终完成的要出厂的产品,但实际上,这主要是指大多数“备货生产型”的企业而言。在这类企业中,虽然可能要用到多种原材料和零部件,但最终产品的种类一般较少,且大都是标准产品,这种产品的市场需求的可靠性也较高。因此,通常是将最终产品预先生产出来,放置于仓库,随时准备交货。

BOM—物料清单或产品结构表(Bill of material).

BPR—企业业务流程重组(Business process Reengineering). 业务流程重组就是重新设计和安排企业的整个生产、服务和经营过程,使之合理化。通过对组织原来生产经营过程的各个方面、每个环节进行全面的调查研究和细致分析,对其中不合理、不必要的环节进行彻底的变革。

DRP (Distribution Resource Planning)–分销资源计划是分销需求计划的延伸部分,涉及分销系统中的关键资源(如仓储空间、劳动力、货币资金、运输工具等等)的计划。

JIT (Just-in-time)–准时制生产指建立在力求消除一切浪费和不断提高生产率基础上的一种生产理念。它覆盖了从产品设计直到产成品发送一整套的生产活动。只要这些活动是出产一件最终产品所需要的,包括从原材料开始的各个在制品生产阶段,都必须向消除一切浪费、不断提高生产率的目标看齐。准时制生产的主要思想有:尽可能地减少库存;产品质量追求零缺陷;通过缩短调整准备时间、等待队列长度,减少批量等来压缩提前期等等。

IM—库存管理(Inventory Management).

PAC—生产作业控制(Production Activity Control). PP—生产计划大纲(Production Planning). POQ—周期订货法(Period Order Quantity). HR—人力资源计划(Human Resources).

SD–分销管理(Sales And Distribution).

SOP—销售与运作规划(Sales and Operations Planning).

SS—安全库存(Safety Stock). 安全库存:是一种额外持有的库存,它作为一种缓冲器用来补偿在订货提前期内实际需求超过期望需求量或实际提前期超过期望提前期所产生的需求。

L/T—提前期(Lead Time).

LLC—低层码(Low-Level Code).

SFC—车间作业控制(Shop Floor Control).

RCCP—粗能力计划(Rough-cut Capacity Planning).

CRP—-能力需求计划(Capacity Requirements Planning). 确定为完成生产任务具体需要多少劳力和机器资源的过程。在MRP 系统中,已下达的车间订单和计划订单是能力需求计划的输入。能力需求计划将这些订单转换成不同时区、不同工作中心上的工时数。有时会出现这样的情况,粗能力计划分析认为企业的现有生产能力足以完成主生产计划,而能力需求计划经过更细致的分析,得出在某些时段生产能力不足的结论。

ECN—设计变更通知(Engineering change notice).

ECO—设计变更通知(Engineering change Order).

ETO—专项生产(Engineer-to-Order).

FOQ—固定批量法(Fixed Order Quantity). 一种批量订货方法,每次订货时都采用预先确定的同样数量。

EOQ (Economic Order Quantity)–经济订货批量 是固定订货批量模型的一种,可以用来确定企业一次订货(外购或自制)的数量。当企业按照经济订货批量来订货时,可实现订货成本和储存成本之和最小化。

FG—成品(Finished Goods )

RM– -原材料(Raw Materials )

I/O–(Input/Output Control )投入/产出控制

KPI–(Key Performance Indicator )关键业绩指标

OA—(Office Automation) 办公自动化

EAM–(Enterprise Assets Management )企业资产管理

WMS–(Warehouse Management System)仓库管理系统

Win-Win—共赢

TCO–(Total Cost Ownership)总体拥有成本

RTE–(Real-time Enterprise)实时企业

EIP–(Enterprise Information Portal )企业信息门户

MIS–(management information system) 管理信息系统

KM–(knowledge management) 知识管理

SCM–(supply chain management) 供应链管理

EAI–(enterprise application integration) 企业应用集成

BSC–(Balanced Score Card) 平衡记分卡

CO –(Customer Order) 客户订单

ETO–(Engineer To Order) 工程生产

FCS–(Forecast) 预估

IPQC–(In-Process Quality Control 制程质量管理) IQC–(Incoming Quality Control) 进料质量管理

ISO–(International Organization for Standardization) 国际标准组织

OQC–(Out-going Quality Control) 出货质量管理

PDCA–(Plan-Do-Check-Action)PDCA 管理循环

QA–(Quality Assurance) 质量保证

QC –(Quality Control) 质量管理

QCC–(Quality Control Circle) 品管圈

QE –(Quality Engineering) 质量工程

SFC–(Shop Floor Control) 现场控制

SO–(Sales Order) 订单

WIP–(Work In Process) 在制品

Account Payable—应付款

Account Receivable—应收款

Address Book—地址名册

Agreement—协议

ABC Classification–ABC 分类法/对于库存的所有物料,按照全年货币价值从大到小排序,然后划分为三大类,分别称为A 类、B 类和C 类。A 类物料价值最高,受到高度重视,处于中间的B 类物料受重视程度稍差,而C 类物料价值低,仅进行例行控制管理。ABC 分类法的原则是通过放松对低值物料的控制管理而节省精力,从而可以把高值物料的库存管理做得更好。

Actual Capacity–实际能力

Alternative Routine–替代工序/

Available Material–可用材料

Available Inventory–可达到库存/

Available Stock–达到库存

Actual Unit Cost—实际单位成本

Activity Based Costing—ABC 成本法

Agile Manufacturing—敏捷制造

Acquisition Cost–定货费

Assemble-To-Order–定货组装

Automated Storage/Retrieval System(AS/RS)–自动化仓储系统

Activity Cost Pool–作业成本集

Available To Promise(ATP)–可供销售量

American Production and Inventory Control Society.Inc.(APICS)–美国生产与库存管理系统

Advanced Manufacturing Technology(AMT)–先进制造技术Anticipation Inventory–预期储备

Batch—批量

Back flush–倒冲法根据已生产的装配件产量,通过展开物料清单,将用于该装配件或子装配件的零部件或原材料数量从库存中冲减掉。

Batch Process—批流程

Bill of Lading–提货单

Buyer—采购员

Back Scheduling–倒排计划

Bill Of Resource(BOR)–资源清单

Business Plan–经营规划

Bottleneck–瓶颈资源(工序)

Back Order–脱期定单

Backlog–拖欠定单

Bucketless System–无时段系统

Continuous Process—连续流程

Customer Relationship Management—客户关系管理

Cumulative Lead Time—累计提前期

Cost Method—成本方法

Current Unit Cost—当前单位成本

Contract—合同

Closed Loop MRP–闭环物料需求计划

Cycle Counts—循环盘点一种库存盘点方法。库存按计划定期盘点,而不是一年才盘点一次。例如,某种物料的库存达到订货点时,或新物料到库时都可以进行盘点。也可以事先订立某种一贯的盘点原则,比如对价值高并且流动快的物料多盘点;对价值低或流动慢的物料少盘点。最有效的周期盘点制度要求每个工作日清点一定数目的物料。周期盘点最主要的目的是发现那些疵点存货(如:存在数量、质量、规格、日期等等方面的问题),进而追究其原因,最终消除导致问题产生的根本因素。

Carrying Cost –保管费

Cost Roll-Up–成本滚动计算法

Costed BOM–成本物料单

Cost Of Stockout –短缺损失

Critical Path Method–关键路线法

Computer-Aided Process Planning(CAPP)–计算机辅助工艺设计Computer-Aided Software Engineering(CASE)–计算机辅助软件工程Computer-Aided Design–(CAD)计算机辅助设计

Computer-Aided Manufacturing(CAM)–计算机辅助制造

Computer Integrated Manufacturing System(CIMS)–计算机集成制造系统Critical Ratio–紧迫系数

Component–子件/组件

Cost Driver Rate–作业成本发生因素单位费用

Cost Driver–作业成本发生因素

Customer Deliver Lead Time –客户交货提前期

Cumulative Lead Time –累计提前期

Continuous Process –连续流程

Customer Oriented Manufacturing Management System(COMMS)–面向客户制造管理系统

Capacity Level–能力利用水平

Capacity Management–能力管理

Capacity Requirements Planning –能力需求计划

Current Standard Cost –现行标准成本

Date Available–有效日期

Date Changed–修改日期

Date Closed–结束日期

Date Due–截止日期

Date in Produced–生产日期

Date Inventory Adjust–库存调整日期

Date Obsolete–作废日期

Date Required–需求日期

Date Received–收到日期

Date Released–交付日期

Date to Pull–发货日期

Disbursement List–发料单

Dependent Demand—相关需求

Distributed Control System(DCS)–分布式控制系统

Distributed MRP(DMRP)–分布式

MRP Distribution Resource Planning(DRP)–分销资源计划

Distribution Requirements Planning–分销需求计划

Demonstrated Capacity–纪实能力

Decision Support System –决策支持系统

Dispatch List–派工单

Days Offset–偏置天数

Demand Management – 需求管理

Demand Time Fence(DTF) –需求时界

Demand Cycle – 需求周期

Drop Shipment– 直运

Discrete Manufacturing—离散生产

Electronic Data Interchange(EDI)–电子数据交换

Ergonomics–工效学

Economic Order Quantity(EOQ)– 经济定货量法

Earliest Due Date–最早定单完成日期

Engineering Change Order/Notice (ECO) –设计变更通知

Engineering BOM –工程物料清单

Engineer-To-Order(ETO) –专项生产

Fixed Lead Time—固定提前期

Fixed Assets—固定资产

Forecast—预测

Financial Accounting–财务会计

Financial Entity–财务实体

Fixed Period Requirements–定期用量法

Fixed Order Quantity(FOQ)–固定批量法

Formal System –规范化管理系统

Feature –基本组件

Floor Stock,Bulk Item –作业现场库存

Firm-Planned Order–确定定单

Firm-Planned Time Fence –确定计划时单

Flexible Manufacturing System(FMS)–柔性制造系统

Feature–特征件

Forward Scheduling – 顺排计划

Favorable Variance –有利差异

Finite Capacity Scheduling(FCS)–有限能力计划

Finite Forward Scheduling–有限顺排计划

Finite Loading –有限排负荷

Final Assembly Schedule(FAS)–总装进度

Gross Requirements–毛需求

Group Technology(GT)–成组技术

Hedge Inventory–囤积库存

Informal System–非规范化管理

Inventory–库存

Indented BOM– 缩排式物料清单

Item, Material, Part–物料

Item Master, Material Master – 物料主文件

Infinite Loading–无限排负荷

Inspection ID–检验标识

Inventory Carry Rate–库存周转率

Inventory Turnover–库存周转次数/一年中存货流动或循环的次数,是对为支持一定水平的销售活动的库存投资的度量。计算方法是用全年售出货物成本除以平均存货价值。Independent Demand—独立需求

Intermittent Manufacturing—间歇生产/

Job Shop–机群式布置车间

Kitting– 配套出售件

Lean Production—精益生产

Load–负荷

Load Leveling–负荷量

Location—货位

Lot—批号

Logistics—后勤保证体系

Least Slack Per Operation –最小单个工序平均时差

Lot Sizing – 批量规则

Lot Size Inventory– 批量库存

Lead Time–提前期

Lead Time Offset–提前期偏置

Lot-For-Lot –因需定量法

Live Pilot–应用模拟

anufacturing Lead Time—加工提前期

Move Time –传送时间

Make-To-Order(MTO)–定货生产

Management Accounting –管理会计

Management Information System(MIS)–管理信息系统

Minimum Balance–最小库存余量

Management By Exception –例外管理法

Modular BOM –模块化物料单

Measure Of Velocity–生产速率水平

Maintenance, Repair, And Operation Supplies–维护修理操作物料

Material Management–物料管理

Material Review Board–物料核定机构

Material Manager –物料经理

Material Available–物料可用量

Modern Materials Handling –现代物料搬运

Manufacturing Bom–制造物料清单

Manufacturing Executive System (MES)– 制造执行系统Master Production Schedule(MPS) –主生产计划

Master Scheduler –主生产计划员

Net Requirements–净需求

Net Change–净改变法

Netting–净需求计算

New Location–新仓位

New Warehouse–新仓库

On-hand Balance–现有库存量

Open Order–未结订单

Order Entry–订单输入

Order Point–订货点

Order Policy–订货方针

Order Remarks–订货备注

Operation—工序

Order Point System–定货点法

Ordering Cost –定货费

Overhead Apportionment/Allocation –间接费分配

Overhead Rate, Burden Factor, Absorption Rate–间按费率

Option–可选件

Optimized Production Technology(OPT) –优化生产技术

Part–零件

Part Bills–零件清单

Part Number–零件编号

Picking–领料/提货

Picking List–领料单

Price—价格

Price Invoice–发票价格

Price Purchase Order–采购订单价格

Priority Planning–优先计划

Product Control–产品控制

Production Line–产品线

Production Rate–产品率

Production Tree–产品结构树

rchase Order Tracking–采购订单跟踪

Purchase Order—采购订单

Purchase Lead Time—采购提前期

Physical Inventory—实地盘点

Product Data anagement—产品数据管理

Product Lifecycle Management—产品寿命周期管理

Partner Relationship Management—合作伙伴关系管理

Process Manufacturing—流程型生产

Projected Available Balance—预计可用库存量

Planned Capacity—计划能力

Planning Horizon—计划期

Policy And Procedure –工作准则与工作规程

Planned Order Receipts – 计划产出量

Planned Order–计划定单

Planned Capacity–计划能力

Program Evaluation Research Technology (PERT)–计划评审技术

Planning Horizon– 计划期

Planned Time Fence(PTF)–计划时界

Planned Order Releases–计划投入量

Planning BOM–计划物料单

Proposed Cost–建议成本

Parent Item –母件

Pareto Principle– 帕拉图原理

Production Cycle– 生产周期

Production Activity Control –生产作业控制

Point Of Use –使用点

Phantom – 虚拟件

Performance Measurement–业绩评价

Projected Available Balance–预计可用库存量

Priority–优先级

Prototyping, Computer Pilot –原型测试

Period Order Quantity(POQ)–周期定货量法

Pegging –追溯

Quantity Allocation–已分配量

Quantity At Location–仓位数量

Quantity Backorder–欠交数量

Quantity Completion–完成数量

Quantity Demand–需求量

Quantity Gross–毛需求量

Quantity In–进货数量

Queue Time–排队时间

Resupply Order –补库单

Rough-Cut Capacity Planning(RCCP) –粗能力计划

Repetitive Manufacturing –重复式生产

Rated Capacity–额定能力

Run Time – 加工时间

Resource Requirements Planning 资源需求计划

Requisition –请购单

Regeneration–全重排法

Released Order ,Open Order–下达定单

Required Capacity–需用能力

Routing–工艺路线详细描述某项目制造过程的文件。包括要进行的加工及其顺序。涉及到的工作中心以及准备和加工所需的工时定额。在有些企业里,工艺路线还包括工具、操作工技术水平、检验及测试的需求等等。

Standard Product Cost–标准产品成本

Standard Set Up Hour–标准机器设置工时

Standard Unit Run Hour–标准单位运转工时

Standard Wage Rate–标准工资率

Status Code–状况代码

Safety Stock—安全库存量是为应付由于供需波动而发生的意外需求而设置的库存量。Stores Control–库存控制

Suggested Work Order–建议工作单

Standard Unit cost—标准单位成本

Stock Adjustment—库存调整

Sales Order—销售订单

Supplier—供应商

Supply Chain Management—供应链管理

Supplier Relationship Management—供应商关系管理

Scheduled receipts—计划接收量

Scrap—废品率

Safety Lead Time –安全提前期

Standard Cost System –标准成本体系

Shop Floor Control –车间作业控制

Shop Order–车间定单

Scrap–废品率

Scheduler –计划员

Supply Chain–供需链

Shop Calendar –工作日历

Summarized BOM– 汇总物料清单

Scheduled Receipts –计划接收量

Seasonal Stock –季节储备

Ship-To–交货地

Set Up Time –准备时间

Spending Variance, Expenditure Variance–开支差异

Single-Minute Exchange Of Dies(SMED)–快速换模法

Simulated Cost–模拟成本

Shrinkage–缩减率

Synchronous Manufacturing –同步制造

Sales And Operations Planning(SOP) –销售与动作规划

Theory of Constraints (TOC)–约束理论

Transit Time–传送时间

Top Management Commitment –领导承诺

Total Quality Management(TQM) –全面质量管理

Time Bucket–时段

Time Fence – 时界

Time Zone–时区

Pipeline Stock –在途库存

Total Lead Time–总提前期

Unit Cost–单位成本

Vendor Scheduler–采购计划员

Volume Variance –产量差异

Value Chain –价值链

Virtual Organization–虚拟企业

Value-Added Chain –增值链

Work Center–工作中心能够完成相类似的加工操作的一组机器设备或人员,能够被能力需求计划作为一个单元来考虑。

Work Center Capacity–工作中心能力

Work in Process–在制品

Work Order–工作令

Work Scheduling–工作进度安排

Work Order Tracking–工作令跟踪

Warehouse—仓库

Weighted Average Method—移动加权平均法

Wait Time – 等待时间

Work Flow –工作流

World Class Manufacturing Excellence—国际优秀制造业

What-If –如果怎样-将会怎样

Yield – 成品率

Zero Inventories–零库存美国生产和库存控制协会(APICS,American Production &InventoryControlSociety)采用的一个术语,其意义类似于准时制生产。

阅读全文 »

id还是code

发表于 2023-08-03 10:25:32
字数统计 1128

背景

在系统设计时,经常会出现id,code的属性。这个标准是什么,如何使用,有规律吗?

譬如 下面举个例子仓库,有三个字段,用JSON表达如下

1
2
3
4
5
{
id:5
code:"SH01"
name:"上海昆山仓库"
}

现在要建一个库存表,这时库存表里应该设计为增加仓库ID,还是仓库code?

本文结合自己的一些经验,归纳终结一下啊。有不同意见的,欢迎讨论。

生成方式

id 系统底层自动生成。一般是采用数据库自增和雪花算法,或者其他的变种。

而code的生成方式一般是手动输入,也有可能是业务层根据特定上下文维度来生成(譬如条码code = 款号code+颜色code+尺码code)

正因为id时底层内部行为,在创建时是无法指定或者推断的。而code是在外部确定传给该系统的。在分布式系统中通过这个code进行幂等性校验就天生的自然,并容易形成共识和规范。

数据类型

id的类型一般是整型或者长整形。并且大都是具备顺序行,或者类似顺序性。查询速度应该比较快,TODO testing

code的类型一般是字符串。因为字符串的字面量的表现力时int无法比拟的。所以String类型的兼容性比id的int要好很多。你的系统的类型是可以确定的,但是你的数据来源有可能来源于外部的其他系统,这个时候使用String类型的code是个明智选择。

长度

id一般都非常长,使用上非常不方便。code 相对非常短。并且一般是有固定长度设定。方便对齐,沟通

可变性

id肯定是不可变的,一旦产生终身跟随,不可修改。

code也应该遵守这个规则。一定不可变。

大多数情况code也是如此,但是也有例外譬如user的code用什么,如果没有用户在注册时都输入了身份证,这个code就很完美,并且永远唯一。但是现实中这个是不现实的。如果可以用手机号码作为code吗,看上去可以。系统各处,系统间都用手机号码来标识用户,用于一旦换手机号码,历史数据就是个大坑。这种情况user就不能用手机号码来作为code。那该用那个字段作为code, 我的理解是没有。如果我们认定一个user是一个自然人,在我们系统没有任何确定的code来标识一个自然人,这个code就没法确定。

具备含义和功能

id是无意义的,当然一般具备一定的顺序性。

而code 时非常具备业务含义的,人看到code就会立即知道他们在具体指哪个东西。可用于交流沟通,文档存储,协议定义。外部系统通过这个code来标识具体要操作那个实体,进行系统间交互。

同时code可以增加校验位,拆解规则等来附带更多信息和功能。

业务稳定性

code具备非常好的业务稳定性,譬如对于外部系统上海昆山仓库编号无论系统如何改造,存储机制时什么,仓库编号都是固定和稳定的,都是SH01。

而id就不是这样。注意id是内部实现细节。

结论

在当前实体的设计时,要尽最大可能性的寻找到那个或者哪些字段可以逻辑上标识一个对象,重要的一点是一定是不可变的。如果有就定义这个字段为code, 或者这些字段计算或拼接产生出一个code。

并且其他实体对实体的关联都使用这个code,而不是id。与其他系统的API也使用code。为什么?因为code具备稳定性,有意义,方便沟通,可预先定义等优点。把这个id作为一个系统内部的实现隐藏起来。

例如库存表的就使用warehouse_code,而不是warehouse_id

如果实在找不到一个不可变的code。就退而求齐是。使用这个id

譬如user表没有code,只有userId, 并且其他系统也通过该userid进行沟通

BTW, 这里的code是个广义上的code,而不是说属性的名就是code, 建议在业务系统自定义个annotation(譬如@Code)来标识那个属性是code。

阅读全文 »

xml与对象相互转换

发表于 2023-08-03 10:07:48
字数统计 390
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using System.IO;
using System.Xml;
using System.Text.RegularExpressions;

namespace Helper
{
    public class XmlSerializeHelper
    {

        public static string Serialize<T>(T obj)
        {
            return Serialize<T>(obj, Encoding.UTF8);
        }

        //对象转XML
        public static string ObjToXml(object obj)
        {
            using (MemoryStream Stream = new MemoryStream())
            {
                XmlSerializer xml = new XmlSerializer(obj.GetType());
                xml.Serialize(Stream, obj);
                Stream.Position = 0;
                StreamReader sr = new StreamReader(Stream);
                string str = sr.ReadToEnd();
                return str;
            }

        }

        /// <summary>  
        /// 实体对象序列化成xml字符串  
        /// </summary>  
        /// <typeparam name="T"></typeparam>  
        /// <param name="obj"></param>  
        /// <returns></returns>  
        public static string Serialize<T>(T obj, Encoding encoding)
        {
            try
            {

                if (obj == null)
                    throw new ArgumentNullException("obj");

                var ser = new XmlSerializer(obj.GetType());
                using (var ms = new MemoryStream())
                {
                    using (var writer = new XmlTextWriter(ms, encoding))
                    {
                        writer.Formatting = Formatting.Indented;
                        ser.Serialize(writer, obj);
                    }
                    var xml = encoding.GetString(ms.ToArray());
                    xml = xml.Replace("xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"", "");
                    xml = xml.Replace("xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"", "");
                    xml=Regex.Replace(xml,@"\s{2}","");
                    xml = Regex.Replace(xml, @"\s{1}/>", "/>");
                    return xml;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>  
        /// 反序列化xml字符为对象,默认为Utf-8编码  
        /// </summary>  
        /// <typeparam name="T"></typeparam>  
        /// <param name="xml"></param>  
        /// <returns></returns>  
        public static T DeSerialize<T>(string xml)
            where T : new()
        {
            return DeSerialize<T>(xml, Encoding.UTF8);
        }

        /// <summary>  
        /// 反序列化xml字符为对象  
        /// </summary>  
        /// <typeparam name="T"></typeparam>  
        /// <param name="xml"></param>  
        /// <param name="encoding"></param>  
        /// <returns></returns>  
        public static T DeSerialize<T>(string xml, Encoding encoding)
            where T : new()
        {
            try
            {
                var mySerializer = new XmlSerializer(typeof(T));
                using (var ms = new MemoryStream(encoding.GetBytes(xml)))
                {
                    using (var sr = new StreamReader(ms, encoding))
                    {
                        return (T)mySerializer.Deserialize(sr);
                    }
                }
            }
            catch (Exception e)
            {
                return default(T);
            }

        }  
    }
}
阅读全文 »

字符串未被识别为有效的datetime

发表于 2023-08-02 16:28:18
字数统计 262

最近需要把“20121010”转换为“2012-10-10”格式,直接用Convert.ToDateTime(“20121010”),部分电脑系统会报错“未被识别的DateTime类型”。

在C#中如果将一个字符串类型的日期转换成日期类型很方便的

即使用Convert.ToDateTime(“2015/01/01”).ToString()或DateTime.TryParse 可完成转换,前提是字符串里的格式必须是系统可以识别的日期格式 如: yyyy-MM-dd yyyy/MM/dd 等等…. 如果字符串中的格式是自定义的话(yyyyMMdd),那么系统的方法就无法直接完成转换(虽然字符串的内容是日期,如20111021) 还好C#提供了强大的可自定义格式转换功能,可以完成自定义需求,不废话直接上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
public class DateTime_TryParseExact_Demo
{
    public static void Main()
    {
        string str = DateTime.Now.ToString("yyyyMMdd");
        string[] format = {"yyyyMMdd"};
        DateTime date;
        if (DateTime.TryParseExact(str, 
                                   format, 
                                   System.Globalization.CultureInfo.InvariantCulture,
                                   System.Globalization.DateTimeStyles.None, 
                                   out date))
        {
             Console.WriteLine("Custom DateTime Type Convert success:"+date.ToString());
        }
        else
             Console.WriteLine("Custom DateTime Type Convert error ");
    }//end Main
}//end
阅读全文 »

限制提交文件大小

发表于 2023-08-02 11:22:14
字数统计 206
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/bin/sh
hard_limit=$(git config hooks.filesizehardlimit)
soft_limit=$(git config hooks.filesizesoftlimit)
: ${hard_limit:=100000000} # 100M
: ${soft_limit:=50000000} # 50M

list_new_or_modified_files()
{
    git diff --staged --name-status|sed -e '/^D/ d; /^D/! s/.\s//'
}

unmunge()
{
 local result="${1#\"}"
    result="${result%\"}"
    env echo -e "$result"
}

check_file_size()
{
    n=0 
 while read -r munged_filename
 do
        f="$(unmunge "$munged_filename")"
        h=$(git ls-files -s "$f"|cut -d' ' -f 2)
        s=$(git cat-file -s "$h")
 if [ "$s" -gt $hard_limit ]
 then
            env echo -E 1>&2 "ERROR: hard size limit ($hard_limit) exceeded: $munged_filename ($s)"
            n=$((n+1))
 elif [ "$s" -gt $soft_limit ]
 then
            env echo -E 1>&2 "WARNING: soft size limit ($soft_limit) exceeded: $munged_filename ($s)"
 fi
 done

    [ $n -eq 0 ] 
}

list_new_or_modified_files | check_file_size
阅读全文 »

什么是S.O.L.I.D

发表于 2023-07-26 16:43:22
字数统计 474

S.O.L.I.D 是一個面向對象設計(Object-Oriented Design)的原則集合,它由五個原則組成,每個原則都代表著一個特定的設計原則,旨在幫助開發人員設計出易於擴展、可維護和可重用的軟件。

這些原則是:

  1. 單一職責原則(Single Responsibility Principle,SRP):一個類別應該只有一個職責,即只有一個引起它變化的原因。這樣可以使類別更加聚焦,易於理解、擴展和維護。
  2. 開放封閉原則(Open-Closed Principle,OCP):軟件實體(類別、模塊、函數等)應該對擴展是開放的,對修改是封閉的。這意味著當需求變化時,應該通過擴展現有代碼來實現變化,而不是修改現有代碼。
  3. 里氏替換原則(Liskov Substitution Principle,LSP):子類別應該能夠替換父類別,而不會影響程序的正確性。這意味著在使用繼承時,子類別應該遵守父類別的契約(即父類別定義的行為和屬性),並且不應該改變父類別的行為。
  4. 接口隔離原則(Interface Segregation Principle,ISP):用戶不應該強迫依賴它們不需要使用的接口。這意味著應該根據客戶端的需要,將大的接口拆分為更小的、特定的接口,從而避免不必要的依賴。
  5. 依賴反轉原則(Dependency Inversion Principle,DIP):高層模塊不應該依賴於低層模塊,它們都應該依賴於抽象。這意味著應該通過定義抽象接口或基類,讓高層模塊和低層模塊都依賴於這些抽象,從而實現模塊之間的解耦和可替換性。

遵循 S.O.L.I.D 原則可以幫助開發人員設計出高質量、可擴展和易於維護的軟件。

阅读全文 »

特性和反射

发表于 2023-07-26 16:35:21
字数统计 418

以下是一个示例,展示了如何定义和使用特性,并使用反射来获取特性信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using System;
using System.Reflection;

// 自定义特性类
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
class MyCustomAttribute : Attribute
{
    public string Description { get; }

    public MyCustomAttribute(string description)
    {
        Description = description;
    }
}

// 带有特性的类
[MyCustom("This is a class attribute")]
class MyClass
{
    [MyCustom("This is a method attribute")]
    public void MyMethod()
    {
        Console.WriteLine("Hello from MyMethod");
    }
}

class Program
{
    static void Main()
    {
        // 使用反射获取类的特性
        Type classType = typeof(MyClass);
        MyCustomAttribute[] classAttributes = (MyCustomAttribute[])classType.GetCustomAttributes(typeof(MyCustomAttribute), true);
        foreach (MyCustomAttribute attribute in classAttributes)
        {
            Console.WriteLine("Class Attribute: " + attribute.Description);
        }

        // 使用反射获取方法的特性
        MethodInfo methodInfo = classType.GetMethod("MyMethod");
        MyCustomAttribute[] methodAttributes = (MyCustomAttribute[])methodInfo.GetCustomAttributes(typeof(MyCustomAttribute), true);
        foreach (MyCustomAttribute attribute in methodAttributes)
        {
            Console.WriteLine("Method Attribute: " + attribute.Description);
        }

        // 等待用户输入,防止控制台窗口关闭
        Console.ReadLine();
    }
}

在这个示例中,我们首先定义了一个自定义特性类 MyCustomAttribute,它继承自 Attribute。然后,我们在 MyClass 类和 MyMethod 方法上应用了 MyCustomAttribute 特性,并传入了相应的描述信息。

在 Main 方法中,我们使用反射获取了 MyClass 类和 MyMethod 方法的特性信息。通过调用 GetCustomAttributes 方法并指定特性类型,我们可以获取到应用在类和方法上的特性对象数组。然后,我们遍历特性数组,并打印出特性的描述信息。

请注意,特性和反射是 C# 中强大的功能,可以用于实现各种元编程和自定义行为。在实际应用中,您可以根据需要定义和使用不同的特性,并使用反射来获取特性信息并进行相应的处理。

阅读全文 »

什么是IntPtr

发表于 2023-07-26 16:15:34
字数统计 617

IntPtr是一种特殊的数据类型,它通常用于在编程语言中表示指针或句柄的整数值。”IntPtr”是”Integer Pointer”的缩写。

在许多编程语言中,指针是一种变量,它存储了内存地址的值,可以用来访问内存中的数据。然而,某些编程语言不直接支持指针,或者在特定的上下文中需要使用整数值来表示指针。这时,可以使用IntPtr类型来存储指针或句柄的整数值。

IntPtr类型的大小和表示方式取决于所使用的编程语言和平台。在一些编程语言中,IntPtr类型的大小与指针的大小相同,通常是与机器的字长相匹配的大小。在其他编程语言中,IntPtr类型可能会有固定的大小,无论平台的字长如何。

使用IntPtr类型时需要小心,因为它涉及到直接操作内存地址,可能引发安全和稳定性问题。在使用IntPtr类型时,应该遵循编程语言和平台的相关规范,并且谨慎处理指针操作,以避免潜在的错误和漏洞。

以下是一个示例,展示了如何使用 IntPtr 来处理指针操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System;

class Program
{
    static void Main()
    {
        // 创建一个 IntPtr 对象
        IntPtr ptr;

        // 分配内存并获取指针
        int size = sizeof(int);
        ptr = Marshal.AllocHGlobal(size);

        // 将值存储到指针指向的内存位置
        int value = 42;
        Marshal.WriteInt32(ptr, value);

        // 从指针指向的内存位置读取值
        int readValue = Marshal.ReadInt32(ptr);
        Console.WriteLine("Value read from pointer: " + readValue);

        // 释放分配的内存
        Marshal.FreeHGlobal(ptr);

        // 等待用户输入,防止控制台窗口关闭
        Console.ReadLine();
    }
}

在这个示例中,我们首先创建了一个 IntPtr 对象 ptr,然后使用 Marshal.AllocHGlobal 方法分配了一块内存,并将其指针存储在 ptr 中。然后,我们使用 Marshal.WriteInt32 方法将一个整数值存储到指针指向的内存位置。接下来,我们使用 Marshal.ReadInt32 方法从指针指向的内存位置读取值,并将其打印到控制台上。最后,我们使用 Marshal.FreeHGlobal 方法释放了分配的内存。

请注意,使用指针操作时需要小心,确保正确处理内存分配和释放,以避免内存泄漏和潜在的安全问题。

阅读全文 »

钩子在Win7下无效

发表于 2023-07-26 12:59:07
字数统计 599

最近工作需要,用到了鼠标钩子,并且还是全局鼠标钩子,也就是说,这个钩子监视系统所有消息,因此启动这个功能后,发现程序性能有点受影响,这也是正常的。

但是,原本在xp上运行好好的,放到win7上进行测试,发现过段时间,钩子会自动无效掉,这个时候去人工卸载钩子会弹出无效句柄错误消息(Error Code: 1404)。

这个问题类似指针,指针开始时分配了内存,但过段时间后,指针与该内存切断了联系,但指针指向的值并不是NULL,这个时候去卸载(delete)操作,则肯定是非法的。

所以,反复在网上查找相关的资料和论坛,发现大家都认为要么是win7下权限问题(UAC,管理员身份运行),或者是全局钩子与dl有关的影响,又或者是新版本.Net不支持全局钩子(因为我使用C#调用API),再或者是钩子句柄应该放在代码段区域(code_seg)等等。

最后在msdn论坛上找到了解答:(Hooking problem in Windows 7)

http://social.msdn.microsoft.com/Forums/en-US/windowscompatibility/thread/f6032ca1-31b8-4ad5-be39-f78dd29952da

大概意思就是: Win7移除超时的钩子不是bug,而是win7中为了保护系统而故意的行为,因为安装了全局钩子后,所以消息都要经过这个钩子,并且等待钩子过程执行结束或者钩子达到超时时间才能处理其他的响应,严重影响性能。 其实在vista中已经加入了一些保护措施,但不是很充分,所以在win7加入了当底层钩子多次超时时,就由系统自动卸载掉该钩子。

所以,原因清楚了,方案有两个。 1.在win7系统中加入LowLevelHooksTimeout时间,如[HKEY_CURRENT_USER\Control Panel\Desktop]”LowLevelHooksTimeout”=dword:00002710 2.在安装钩子尽量在一个独立的线程中进行,并且钩子处理过程尽量用较短的时间,其他任何较长时间的处理都放在别的线程中异步处理。(尽量不要写花时间的hook代码)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DWORD WINAPI mouseLLHookThreadProc(LPVOID lParam)
{
    MSG msg;

    _hMouseLLHook = SetWindowsHookEx( WH_MOUSE_LL, .....); 

    while(GetMessage(&msg, NULL, 0, 0) != FALSE) 
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}
阅读全文 »

输出调用堆栈信息

发表于 2023-07-26 11:30:10
字数统计 144

命名空间:System.Diagnostics

得到相关信息:

StackTrace st = new StackTrace(new StackFrame(true)); StackFrame sf = st.GetFrame(0); Console.WriteLine(“ File: {0}”, sf.GetFileName());//文件名 Console.WriteLine(“ Method: {0}”, sf.GetMethod().Name);//函数名 Console.WriteLine(“ Line Number: {0}”, sf.GetFileLineNumber());//文件行号 Console.WriteLine(“ Column Number: {0}”, sf.GetFileColumnNumber());

写日志,便于调试,查找问题

StackTrace st = new StackTrace(new StackFrame(true));只能获取本次的堆栈信息,可以改用下面的方法获取程序的调用堆栈信息。 StackTrace st = new StackTrace(true); 就可以获取程序的整个堆栈调用关系的列表信息。 使用st.ToString()可以直接获取堆栈列表,是不是很方便啊。

阅读全文 »
1 … 3 4 5 … 10
leafcxy

leafcxy

Too simple, sometimes naive.

97 日志
20 标签
GitHub E-Mail
© 2018 - 2024 leafcxy
由 Jekyll 强力驱动
主题 - NexT.Pisces