iframe 一个页面: http://www.gmodules.com/ig/ifr?url=http://www.google.com/ig/modules/docs/docs-full-page-ssl.xml&synd=open&w=1416&h=536&title=&border=%23ffffff%7C3px%2C0px+solid+%23999…
iframe 一个页面:
需要使用ig小工具来协助操作。
iframe 一个页面: http://www.gmodules.com/ig/ifr?url=http://www.google.com/ig/modules/docs/docs-full-page-ssl.xml&synd=open&w=1416&h=536&title=&border=%23ffffff%7C3px%2C0px+solid+%23999…
iframe 一个页面:
需要使用ig小工具来协助操作。
搭建erp用于远程协作, 团队协作, 远程办公
如何安装部署Odoo社区版
部分模块免费的; 安装有2中方式: 源码在操作系统中安装配置 和 Docker安装部署
可升级使用一些收费的功能模块
如何安装Odoo企业版
收费的; 有试用期
https://system0.carlzeng.com:3/web/login
需要准备的目录有:
Odoo ERP的部分
odoo-web-data
config
addons
Odoo 数据库的部分:
odoo-db-data
version: '3.1'
services:
web:
image: odoo:17.0
depends_on:
- odoodb
ports:
- "8069:8069"
volumes:
- ./odoo-web-data:/var/lib/odoo
#- ./config:/etc/odoo
#- ./addons:/mnt/extra-addons
environment:
- HOST=odoodb
- USER=odoo
- PASSWORD=myodoo20250401
odoodb:
image: postgres:15
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=odoo
- POSTGRES_PASSWORD=myodoo20250401
- PGDATA=/var/lib/postgresql/data/pgdata
volumes:
- ./odoo-db-data:/var/lib/postgresql/data/pgdata
cd ~
mkdir odoo
cd odoo
mkdir odoo-web-data && mkdir config && mkdir addons && mkdir odoo-db-data
vi docker-compose.yaml
docker-compose up
访问 http://192.168.6.117:8069
Internal Server Error
The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
web-1 | 2025-04-01 13:30:10,775 1 ERROR ? odoo.http: Exception during request handling.
web-1 | Traceback (most recent call last):
web-1 | File "/usr/lib/python3/dist-packages/odoo/http.py", line 2206, in __call__
web-1 | request._post_init()
web-1 | File "/usr/lib/python3/dist-packages/odoo/http.py", line 1391, in _post_init
web-1 | self.session, self.db = self._get_session_and_dbname()
web-1 | File "/usr/lib/python3/dist-packages/odoo/http.py", line 1397, in _get_session_and_dbname
web-1 | session = root.session_store.new()
web-1 | File "/usr/lib/python3/dist-packages/odoo/tools/func.py", line 28, in __get__
web-1 | value = self.fget(obj)
web-1 | File "/usr/lib/python3/dist-packages/odoo/http.py", line 2132, in session_store
web-1 | path = odoo.tools.config.session_dir
web-1 | File "/usr/lib/python3/dist-packages/odoo/tools/config.py", line 766, in session_dir
web-1 | os.makedirs(d, 0o700)
web-1 | File "/usr/lib/python3.10/os.py", line 225, in makedirs
web-1 | mkdir(name, mode)
web-1 | PermissionError: [Errno 13] Permission denied: '/var/lib/odoo/sessions'
web-1 | 2025-04-01 13:30:10,776 1 INFO ? werkzeug: 192.168.6.221 - - [01/Apr/2025 13:30:10] "GET /fav
icon.ico HTTP/1.1" 500 - 0 0.000 0.001
#解决办法:
$ sudo chmod -R 777 addons
$ sudo chmod -R 777 config
$ sudo chmod -R 777 odoo-db-data
$ sudo chmod -R 777 odoo-web-data
设置好权限以后, 可以运行访问网页

下载网盘地址 https://drive.google.com/drive/folders/1VUujb8d9Y1sQ98xA0jk4WZteryn0oOoe
How to install Odoo Enterprise.
1: download and install community edition.
2: download the zip file called addons-18e.zip and put it into /usr/lib/python3/dist-packages
3: extract the file and allow overwrite all
4: restart odoo server & update apps
5: download odoo18_unlimited.zip from the same drive link
6: unzip odoo18_unlimited.zip into your addons directory (try to keep separate from main odoo addons.
7: restart odoo server again and then update apps in odoo
8: activate odoo_unlimited
9: install accounting module
10: activate odoo
11: All done
本小节来源: https://babia.to/threads/odoo-enterprise.37673/page-100
mkdir odoo18e
cd odoo18e
docker pull odoo:18.0-20241125
#选了半天, 只知道是16版本, 先试试16.9; 在https://hub.docker.com/_/postgres找到的tag
docker pull postgres:16.9
mkdir odoo-web-data && mkdir config && mkdir addons && mkdir odoo-db-data
mkdir dist-packages
vi docker-compose.yaml
$ sudo chmod -R 777 addons
$ sudo chmod -R 777 config && sudo chmod -R 777 odoo-db-data && sudo chmod -R 777 odoo-web-data && sudo chmod -R 777 dist-packages
docker-compose up
docker pull odoo:18.0-20241125
[MARK] 第一步就有问题, 需要安装特定的deb文件
https://drive.google.com/drive/folders/1phzmPK7nQ65WKCqAa_N25OupxKMAfxFF
然后在: 2: download the zip file called addons-18e.zip and put it into /usr/lib/python3/dist-packages
关键就是这个deb文件和docker pull 到的 ce版本不一样!
问题变成: 如何让deb在docker中运行, 在自动解压和覆盖一个addons-18e.zip文件到目录/usr/lib/python3/dist-packages;
docker exec -it --user root odoo18e-web-1 /bin/bash
find / -name odoo
/usr/bin/odoo
/usr/share/doc/odoo
/usr/share/lintian/overrides/odoo
/usr/lib/python3/dist-packages/point_of_sale/tools/posbox/overwrite_before_init/etc/logrotate.d/odoo
/usr/lib/python3/dist-packages/point_of_sale/tools/posbox/overwrite_after_init/home/pi/odoo
/usr/lib/python3/dist-packages/odoo
/usr/lib/python3/dist-packages/dist-packages2/odoo
/etc/init.d/odoo
/etc/logrotate.d/odoo
/etc/odoo
/mnt/extra-addons/point_of_sale/tools/posbox/overwrite_before_init/etc/logrotate.d/odoo
/mnt/extra-addons/point_of_sale/tools/posbox/overwrite_after_init/home/pi/odoo
/var/log/odoo
/var/lib/odoo
find / -name odoo.conf
/usr/lib/python3/dist-packages/point_of_sale/tools/posbox/configuration/odoo.conf
/etc/odoo/odoo.conf
/mnt/extra-addons/point_of_sale/tools/posbox/configuration/odoo.conf
service odoo restart
然后在解压 6: unzip odoo18_unlimited.zip into your addons directory (try to keep separate from main odoo addons.
7: restart odoo server again and then update apps in odoo
8: activate odoo_unlimited
9: install accounting module
10: activate odoo
这些能用dockerfile来完成吗?
使用docker-compose.yml
version: '3.1'
services:
web1:
image: odoo:17.0
depends_on:
- odoodb2
ports:
- "8070:8069"
volumes:
- ./odoo-web-data:/var/lib/odoo
# - ./config:/etc/odoo
- ./addons:/mnt/extra-addons
- ./dist-packages:/usr/lib/python3/dist-packages
environment:
- HOST=odoodb2
- USER=odoo
- PASSWORD=myodoo20250713
odoodb2:
image: postgres:15
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=odoo
- POSTGRES_PASSWORD=myodoo20250713
- PGDATA=/var/lib/postgresql/data/pgdata2
volumes:
- ./odoo-db-data:/var/lib/postgresql/data/pgdata2
odoodb-1 | PostgreSQL Database directory appears to contain a database; Skipping initialization
odoodb-1 |
odoodb-1 | 2025-07-13 14:53:40.108 UTC [1] LOG: starting PostgreSQL 15.12 (Debian 15.12-1.pgdg120+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit
odoodb-1 | 2025-07-13 14:53:40.108 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
odoodb-1 | 2025-07-13 14:53:40.108 UTC [1] LOG: listening on IPv6 address "::", port 5432
odoodb-1 | 2025-07-13 14:53:40.119 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
odoodb-1 | 2025-07-13 14:53:40.129 UTC [29] LOG: database system was shut down at 2025-07-13 14:53:13 UTC
odoodb-1 | 2025-07-13 14:53:40.138 UTC [1] LOG: database system is ready to accept connections
web-1 | Traceback (most recent call last):
web-1 | File "/usr/local/bin/wait-for-psql.py", line 3, in <module>
web-1 | import psycopg2
web-1 | ModuleNotFoundError: No module named 'psycopg2'
web-1 exited with code 1
把odoo:18.0-20241125 换成了odoo18
故障依旧
把odoo:18 换成能正常使用的 odoo:17
故障依旧, 说明不是odoo包本身的问题.
成功使用18.0-20241125版本
version: '3.1'
services:
web:
image: odoo:18.0-20241125
depends_on:
- odoodb
ports:
- "8070:8069"
volumes:
- ./odoo-web-data:/var/lib/odoo
#- ./config:/etc/odoo
- ./addons:/mnt/extra-addons
#- ./dist-packages:/usr/lib/python3/dist-packages
environment:
- HOST=odoodb
- USER=odoo
- PASSWORD=myodoo20250713
odoodb:
image: postgres:15
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=odoo
- POSTGRES_PASSWORD=myodoo20250713
- PGDATA=/var/lib/postgresql/data/pgdata
volumes:
- ./odoo-db-data:/var/lib/postgresql/data/pgdata
下一步 进一步把配置的目录都逐一映射出来
原因是这个: – ./dist-packages:/usr/lib/python3/dist-packages 一旦添加这个, 就会报错误, 原因是系统里面有内容, 而映射出来的目录是空的. 需要先运行起来以后, 然后把 docker里面的dist-packages内容都复制出来,然后在添加映射.


通过复制出来的方式, 添加addons-18e.zip, 可是…
docker cp 容器Id或name:容器内路径 本地文件夹路径
docker cp containername:/usr/share/nginx/html /volume2/KingchuxingSSD512G/docker/compose/it-tools/html
docker cp b55461b312c7:/usr/lib/python3/dist-packages /root/odoo18e/
root@debian12:~/odoo18e/dist-packages# ls
Babel-2.10.3.egg-info _distutils_hack
Jinja2-3.1.2.egg-info _ldap.cpython-312-x86_64-linux-gnu.so
MarkupSafe-2.1.5.egg-info _rjsmin.cpython-312-x86_64-linux-gnu.so
OpenSSL _sass.abi3.so
PIL _yaml
PyPDF2 asn1crypto
PyYAML-6.0.1.dist-info asn1crypto-1.5.1.egg-info
Unidecode-1.3.8.egg-info attr
XlsxWriter-3.1.9.egg-info attrs
__pycache__ attrs-23.2.0.dist-info
_cbor2.cpython-312-x86_64-linux-gnu.so babel
_cffi_backend.cpython-312-x86_64-linux-gnu.so
root@debian12:~/odoo18e/dist-packages# cd ..
root@debian12:~/odoo18e# ls
addons config dist-packages docker-compose.yaml odoo-db-data odoo-web-data
root@debian12:~/odoo18e# docker cp b55461b312c7:/usr/lib/python3/dist-packages /root/odoo18e/
invalid symlink "/root/odoo18e/dist-packages/babel/global.dat" -> "../../../../share/python-babel-localedata/global.dat"
root@debian12:~/odoo18e# docker cp b55461b312c7:/usr/lib/python3/dist-packages /root/odoo18e/
invalid symlink "/root/odoo18e/dist-packages/babel/global.dat" -> "../../../../share/python-babel-localedata/global.dat"
有没有其他办法永久性改变docker中的某个特定目录内容?
临时的workaround: 直接复制到docker中去, 每次 重启docker 都要重新去复制进去, 然后解压缩, 覆盖
Steps:
复制本机addons-18e.zip到debian12的目录中去/root/odoo18e/
scp -P 22226 /Users/carlzeng/Downloads/addons-18e.zip [email protected]:/home/carlzeng/addons-18e.zip
由于权限的缘故, 只能先传输到目录: /home/carlzeng
scp -P 22226 /Users/carlzeng/Downloads/addons-18e.zip [email protected]:/home/carlzeng/addons-18e.zip
[email protected]’s password:
stalledaddaddaddaddons-18e.zip 14% 55MB 4.6MB/s 01:11 ETA
ssh进入debian12的root, 然后复制到root用户目录/root/odoo18e/
cp /home/carlzeng/addons-18e.zip /root/odoo18e/addons-18e.zip
解压缩在/root/odoo18e/
复制debian12中的addons-18e.zip到docker的/usr/lib/python3/dist-packages中去
docker cp /root/odoo18e/addons-18e.zip b55461b312c7:/usr/lib/python3/dist-packages/addons-18e.zip
docker cp /root/odoo18e/addons/ b55461b312c7:/usr/lib/python3/dist-packages/
[忽略]docker exec -it 进入docker的目录进行addons-18e.zip解压缩并覆盖
unzip archive_name.zip`:这将解压缩ZIP文件到当前目录。
tar 无法解压缩.zip文件.
odoo@b55461b312c7:/usr/lib/python3/dist-packages$ apt-get install zip
E: Could not open lock file /var/lib/dpkg/lock-frontend – open (13: Permission denied)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?
如何在docker中解压缩?
docker cp 忽略某个文件
先使用
tar -zcvf archive.tar.gz –exclude=/usr/lib/python3/dist-packages/babel/global.dat /usr/lib/python3/dist-packages
tar -zcvf archive.tar.gz dist-packages
tar (child): archive.tar.gz: Cannot open: Permission denied
tar (child): Error is not recoverable: exiting now
dist-packages/
dist-packages/num2words-0.5.13.egg-info/
dist-packages/num2words-0.5.13.egg-info/requires.txt
dist-packages/num2words-0.5.13.egg-info/PKG-INFO
tar: archive.tar.gz: Cannot write: Broken pipe
tar: Child returned status 2
tar: Error is not recoverable: exiting now
20250715思路:
可以使用UI工具, 浏览 和 打包整个/dist-packages/文件夹, 然后拿到容器外面来修改
使用类似这样的批量命令复制全部
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/_cbor2.cpython-312-x86_64-linux-gnu.so /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/_cffi_backend.cpython-312-x86_64-linux-gnu.so /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/_ldap.cpython-312-x86_64-linux-gnu.so /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/_rjsmin.cpython-312-x86_64-linux-gnu.so /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/_sass.abi3.so /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/cached_property.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/decorator.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/distutils-precedence.pth /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/docopt.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/ldapurl.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/ldif.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/png.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/polib.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pyasn1_modules-0.2.8.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pycairo-1.25.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pysassc.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/requests_file.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/rjsmin.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/roman.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/sass.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/six.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/typing_extensions.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/zope.event-5.0-nspkg.pth /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/zope.interface-6.1-nspkg.pth
web-1 | ImportError: cannot import name ‘localedata’ from partially initialized module ‘babel’ (most likely due to a circular import) (/usr/lib/python3/dist-packages/babel/init.py)
名称 /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/Babel-2.10.3.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/Jinja2-3.1.2.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/MarkupSafe-2.1.5.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/OpenSSL /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/PIL /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/PyPDF2 /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/PyYAML-6.0.1.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/Unidecode-1.3.8.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/XlsxWriter-3.1.9.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/__pycache__ /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/_distutils_hack /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/_yaml /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/asn1crypto /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/asn1crypto-1.5.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/attr /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/attrs /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/attrs-23.2.0.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/babel /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/beautifulsoup4-4.12.3.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/bs4 /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/cached_property-1.5.2.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/cairo /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/cbor2 /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/cbor2-5.6.2.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/certifi /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/certifi-2023.11.17.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/chardet /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/chardet-5.2.0.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/charset_normalizer /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/charset_normalizer-3.3.2.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/cryptography /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/cryptography-41.0.7.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/cryptography.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/dateutil /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/decorator-5.1.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/defusedxml /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/defusedxml-0.7.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/docopt-0.6.2.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/docutils /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/docutils-0.20.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/et_xmlfile /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/et_xmlfile-1.0.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/freetype /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/freetype_py-2.4.0.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/freezegun /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/freezegun-1.2.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/geoip2 /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/geoip2-2.9.0.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/gevent /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/gevent-24.2.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/greenlet /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/greenlet-3.0.3.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/gyp /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/gyp-0.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/idna /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/idna-3.6.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/isodate /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/isodate-0.6.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/jinja2 /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/ldap /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/libsass-0.22.0.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/lxml /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/lxml-5.2.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/lxml_html_clean /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/lxml_html_clean-0.1.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/magic /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/markupsafe /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/maxminddb /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/maxminddb-2.5.2.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/num2words /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/num2words-0.5.13.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/odf /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/odfpy-1.4.2.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/odoo /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/odoo-18.0.post20241125.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/ofxparse /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/ofxparse-0.21.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/openpyxl /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/openpyxl-3.1.2.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/passlib /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/passlib-1.7.4.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pdfminer /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pdfminer.six-20221105.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/phonenumbers /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/phonenumbers-8.12.57.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pillow-10.2.0.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pip /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pip-24.0.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pkg_resources /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/platformdirs /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/platformdirs-4.2.0.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/polib-1.1.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/psutil /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/psutil-5.9.8.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/psycopg2 /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/psycopg2-2.9.9.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pyOpenSSL-23.2.0.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pyasn1 /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pyasn1-0.4.8.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pyasn1_modules /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pypdf2-2.12.1.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pypng-0.20231004.0.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pyserial-3.5.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/python_dateutil-2.8.2.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/python_ldap-3.4.4.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/python_magic-0.4.27.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/python_slugify-8.0.4.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/python_stdnum-1.19.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pytz /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pytz-2024.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pyusb-1.2.1.post2.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/qrcode /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/qrcode-7.4.2.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/reportlab /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/reportlab-4.1.0.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/requests /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/requests-2.31.0.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/requests_file-1.5.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/requests_toolbelt /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/requests_toolbelt-1.0.0.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/rjsmin-1.2.0.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/rlPyCairo /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/rlPyCairo-0.3.0.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/roman-3.3.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/sassutils /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/serial /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/setuptools /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/setuptools-68.1.2.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/six-1.16.0.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/slapdtest /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/slugify /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/soupsieve /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/soupsieve-2.5.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/stdnum /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/typing_extensions-4.10.0.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/unidecode /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/urllib3 /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/urllib3-2.0.7.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/usb /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/vobject /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/vobject-0.9.6.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/watchdog /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/watchdog-3.0.0.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/werkzeug /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/werkzeug-3.0.1.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/wheel /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/wheel-0.42.0.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/xlrd /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/xlrd-2.0.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/xlsxwriter /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/xlwt /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/xlwt-1.3.0.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/yaml /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/zeep /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/zeep-4.2.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/zope /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/zope.event-5.0.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/zope.interface-6.1.egg-info

复制完成了babel文件夹下面的所有文件, 不包含那些连接文件的2个文件
运行报错:
odoodb-1 | 2025-07-15 15:13:35.829 UTC [1] LOG: database system is ready to accept connections
web-1 | Traceback (most recent call last):
web-1 | File "/usr/bin/odoo", line 5, in <module>
web-1 | import odoo
web-1 | File "/usr/lib/python3/dist-packages/odoo/__init__.py", line 49, in <module>
web-1 | _monkeypatches.patch_all()
web-1 | File "/usr/lib/python3/dist-packages/odoo/_monkeypatches/__init__.py", line 31, in patch_all
web-1 | patch_werkzeug()
web-1 | File "/usr/lib/python3/dist-packages/odoo/_monkeypatches/werkzeug_urls.py", line 1044, in patch_werkzeug
web-1 | from ..tools.json import scriptsafe # noqa: PLC0415
web-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web-1 | ModuleNotFoundError: No module named 'odoo.tools'
web-1 exited with code 1
先把addons-18e.zip unzip到dist-packages目录下, 在看看错误会不会自己消失?
cp -r addons/* dist-packages/
还是依旧报同样上方的错误
0716 检查出来: 原来
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo /root/odoo18e/dist-packages/
invalid symlink “/root/odoo18e/dist-packages/odoo/addons/point_of_sale/static/src/fonts/Inconsolata.otf” -> “../../../../../../../../../share/fonts/truetype/inconsolata/Inconsolata.otf”
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/cli /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/conf /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/exceptions.py /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/fields.py /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/http.py /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/import_xml.rng /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/loglevels.py /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/models.py /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/modules /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/netsvc.py /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/osv /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/release.py /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/service /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/sql_db.py /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/tests /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/tools /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/upgrade /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/upgrade_code /root/odoo18e/dist-packages/odoo/
终于解决了错误; 错误变了
web-1 | File "/usr/lib/python3/dist-packages/odoo/_monkeypatches/werkzeug_urls.py", line 1044, in patch_werkzeug
web-1 | from ..tools.json import scriptsafe # noqa: PLC0415
web-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web-1 | File "/usr/lib/python3/dist-packages/odoo/tools/__init__.py", line 8, in <module>
web-1 | from . import pdf
web-1 | File "/usr/lib/python3/dist-packages/odoo/tools/pdf/__init__.py", line 13, in <module>
web-1 | from reportlab.lib import colors
web-1 | ModuleNotFoundError: No module named 'reportlab.lib'
web-1 exited with code 1

docker cp f9f29717401a:/usr/lib/python3/dist-packages/reportlab/graphics /root/odoo18e/dist-packages/reportlab/
docker cp f9f29717401a:/usr/lib/python3/dist-packages/reportlab/lib /root/odoo18e/dist-packages/reportlab/
docker cp f9f29717401a:/usr/lib/python3/dist-packages/reportlab/pdfbase /root/odoo18e/dist-packages/reportlab/
docker cp f9f29717401a:/usr/lib/python3/dist-packages/reportlab/pdfgen /root/odoo18e/dist-packages/reportlab/
docker cp f9f29717401a:/usr/lib/python3/dist-packages/reportlab/platypus /root/odoo18e/dist-packages/reportlab/
docker cp f9f29717401a:/usr/lib/python3/dist-packages/reportlab/rl_config.py /root/odoo18e/dist-packages/reportlab/
docker cp f9f29717401a:/usr/lib/python3/dist-packages/reportlab/rl_settings.py /root/odoo18e/dist-packages/reportlab/
[email protected]’s password:
odoo18_unlimited.zip 100% 2105 34.0KB/s 00:00
ssh进入debian12的root, 然后复制到root用户目录/root/odoo18e/
cp /home/carlzeng/odoo18_unlimited.zip /root/odoo18e/odoo18_unlimited.zip
解压缩在/root/odoo18e/
unzip odoo18_unlimited.zip
Archive: odoo18_unlimited.zip
creating: odoo_unlimited/
creating: odoo_unlimited/models/
inflating: odoo_unlimited/models/update.py
inflating: odoo_unlimited/models/init.py
inflating: odoo_unlimited/init.py
inflating: odoo_unlimited/manifest.py
生成出来odoo_unlimited文件夹
把新生成的odoo_unlimited文件夹放到 addons文件夹中去
cp -r odoo_unlimited ./addons/
核实/编辑docker-compose, 确保 – ./addons:/mnt/extra-addons
如何在UI上更新应用? 刷新
更新应用列表和安装/升级应用。首先,需要激活开发者模式,然后更新应用列表。更新完成后,就可以搜索并安装或升级需要的应用。
搜索的页面, 默认选择了‘应用’, 这时无法搜索到odoo_unlimited. 需要先删除掉‘应用’这个filter.
成功安装, 但是会报JS错误:
Odoo客户端错误
UncaughtClientError > TypeError
Uncaught Javascript Error > this.titleService.setCounters is not a function
Occured on o.carlzeng.com on 2025-07-16 14:45:02 GMT
TypeError: this.titleService.setCounters is not a function
clearUnreadMessage@https://o.carlzeng.com/web/assets/f5ab0f4/web.assets_web.min.js:15472:658
setup/<@https://o.carlzeng.com/web/assets/f5ab0f4/web.assets_web.min.js:15472:539
trigger@https://o.carlzeng.com/web/assets/f5ab0f4/web.assets_web.min.js:745:63
onFocusChange@https://o.carlzeng.com/web/assets/f5ab0f4/web.assets_web.min.js:10466:168
start/<@https://o.carlzeng.com/web/assets/f5ab0f4/web.assets_web.min.js:10469:97
无法完成, 因为一重启docker, 上一步复制进去的内容就全部消失, 洗干净了.
根据18.0的https://github.com/odoo/docker/blob/b254689862e8a1bbb9624bf86022867544582dd2/18.0/Dockerfile
待测试
激活开发者模式后,可在”设置->技术->用户界面->视图”搜索和编辑视图:

可以看到打印模板视图是QWeb视图。QWeb是一个基于XML的模板引擎,用于生成HTML片段和界面。模板命令是写在XML标签内以”t-“开头的属性。
以报价单打印模板为例,可通过“t-field=doc.字段名”输出单据头体信息:
需求: 比如实现如PS5; PS5更换霍尔摇杆这样的子产品; 或者说产品分类
实现:
要设置产品类型,请转到 库存应用程序 ‣ 产品 ‣ 产品,然后从列表中选择所需的产品。
在产品表单的 产品类型 字段中
Product Type
https://system0.carlzeng.com:3/web#action=173&model=product.category&view_type=list&cids=1&menu_id=229
odoo没有父子产品的概念
可以设置系统字段: Category
因为收不到邮件, 管理员新建的用户, 无法完成密码设置, 导致新用户无法进入系统
收不到Email的情况下, 如何新建用户?
直接在登录页面注册, 然后管理员到后台修改.
发现: 访问权限 中无法设置权限.
解决办法: 直接在用户设置页面的; 设置(齿轮图标) – 修改密码
无法关闭, 需关闭整个‘销售’应用模块才行; 而这样做就偏离了预期
如何设置默认视图, 这样一打开就看到 销售订单/订单
或者如何在odoo中自定义页头的菜单; 这样我新建一个菜单, 比如叫做 ‘打开订单列表’ 就时默认的销售订单.
解决办法: 设置菜单, 自定义. Setting – Technical – User Interface – Menu Items
如何直接创建一个销售订单, 而不是每次都从报价单开始
折中方案: 每次在手机上创建好报价单后, 点击‘Confirm’ 确认, 确定为销售订单.
想要把 ‘客户参考号’放到主页面Main的部位, 方便手机用户查看 和录入/核实
From View
Odoo Form View Customization Step-by-Step Guide

删除了docker17的镜像; 重新让docker-compose从远程拉去镜像,
数据库不动
单单删除镜像是没用的,
- ./odoo-web-data:/var/lib/odoo
把这个存储在本地的删除掉; 还是不行, 无法恢复到docker刚安装时的默认状态…
把pg数据库备份出来;

重新在一个目录创建容器
version: '3.1'
services:
web:
image: odoo:17.0
depends_on:
- odoodb
ports:
- "8069:8069"
volumes:
- ./config:/etc/odoo
- ./addons:/mnt/extra-addons
environment:
- HOST=odoodb
- USER=odoo
- PASSWORD=myodoo20250401
odoodb:
image: postgres:15
ports:
- "5435:5432"
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=odoo
- POSTGRES_PASSWORD=myodoo20250401
- PGDATA=/var/lib/postgresql/data/pgdata
volumes:
- ./odoo-db-data:/var/lib/postgresql/data/pgdata

Database restore error: Couldn’t restore database
services:
odoo:
image: odoo:18.0
container_name: odoo_web
restart: always
depends_on:
- postgres
ports:
- "8069:8069"
volumes:
- ./odoo-web-data:/var/lib/odoo
- ./config:/etc/odoo
- ./addons:/mnt/extra-addons
environment:
- HOST=postgres
- POSTGRES_DB=postgres
- POSTGRES_USER=odoo
- POSTGRES_PASSWORD=odoo20260202
postgres:
image: postgres:15
container_name: odoo_postgres
restart: always
volumes:
- ./odoo-db-data:/var/lib/postgresql/data
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=odoo
- POSTGRES_PASSWORD=odoo20260202
- PGDATA=/var/lib/postgresql/data
| PermissionError: [Errno 13] Permission denied: '/var/lib/odoo/.local'
sudo chown -R 101:101 odoo-web-data
sudo chmod -R 775 odoo-web-data
本小结鸣谢: Docker Compose 快速安裝 Odoo
使用单独的文件目录
~/odoo16sandbox
mkdir odoo16sandbox && cd odoo16sandbox
mkdir -p {addons,config,data,odoo-db-data,oca-addons,odoo-web-data}
sudo chown -R 101:101 odoo-web-data
sudo chmod -R 775 odoo-web-data
nano docker-compose.yaml
services:
# PostgreSQL 数据库(适配 Odoo 16 的 14 版本)
dbsb1:
image: postgres:14-alpine
container_name: odoo16-db-sb1
environment:
- POSTGRES_USER=odoo
- POSTGRES_PASSWORD=odoo20260202
- POSTGRES_DB=postgres
volumes:
- ./data/postgres:/var/lib/postgresql/data
restart: always
# Odoo 16 CE 主服务(挂载 OCA 会计模块)
odoosb1:
image: odoo:16.0
container_name: odoo16-app-sb1
depends_on:
- dbsb1
ports:
- "8070:8069"
environment:
- HOST=dbsb1
- USER=odoo
- PASSWORD=odoo20260202
# 核心:挂载自定义模块 + OCA 会计模块目录
- ADDONS_PATH=/mnt/addons,/mnt/oca-addons
volumes:
- ./config/odoo.conf:/etc/odoo/odoo.conf
- ./addons:/mnt/addons
- ./oca-addons:/mnt/oca-addons
- ./data/odoo:/var/lib/odoo
restart: always
PermissionError: [Errno 13] Permission denied: '/var/lib/odoo/.local'
sudo chown -R 101:101 odoo-web-data
sudo chmod -R 775 odoo-web-data
$ sudo chmod -R 777 addons
$ sudo chmod -R 777 config
$ sudo chmod -R 777 odoo-db-data
sudo chmod -R 775 odoo-db-data
没有解决
rm -r odoo-web-data/ && mkdir odoo-web-data
没解决
rm -r odoo-db-data/ && mkdir odoo-db-data
没解决
sudo chown -R 100:101 odoo-web-data
没解决
sudo chown -R 100:101 odoo-db-data/
没解决
sudo chmod -R 777 ./data/odoo
解决了!
原来是提示的意思是: Permission denied: '/var/lib/odoo/.local' 对这个目录没有执行权限, 而这个/var/lib/odoo 映射为 ./data/odoo目录了. 只要解决这个目录的权限问题, 报错就解决了
访问和调试sandbox: http://192.168.6.117:8070/
放到 addons 目录下
mv reporting-engine/* ./
rm -rf reporting-engine # 删除空目录
docker exec -it odoo16-app-sb1 bash
pip3 install xlsxwriter reportlab barcode python-barcode
docker exec -it odoo16-app-sb1 bash
docker部署的odoo16, 所有的addons都没有添加到odoo系统, 不知道问题出在哪里了?
odoo.conf
dbfilter = .*
命令方式:
odoo --db-filter=.
调整映射
volumes:
- ./config/odoo.conf:/etc/odoo/odoo.conf
生效了, 问题的关键
生效了, 问题的关键
生效了, 问题的关键
手动新建的模块 custom_footer_js 无法显示/安装
兜底方案:如果仍未解决,可直接将模块复制到 Odoo 默认的 extra-addons 目录(/mnt/extra-addons),该目录默认会被扫描,验证模块本身是否有问题。
添加:
volumes:
- ./extra-addons:/mnt/extra-addons
通过这个参数调整odoo.conf文件内容: list_db = False
Sample odoo.conf
[options]
db_host = dbsb1
db_port = 5432
db_user = odoo
db_password = odoo20260202
addons_path = /mnt/addons,/mnt/oca-addons
dbfilter = .*
list_db = False
odoo database expiration Fix
version: '3.8'
services:
# PostgreSQL 数据库(适配 Odoo 16 的 14 版本)
db:
image: postgres:14-alpine
container_name: odoo16-db
environment:
- POSTGRES_USER=odoo
- POSTGRES_PASSWORD=odoo20260202
- POSTGRES_DB=postgres
volumes:
- ./data/postgres:/var/lib/postgresql/data
restart: always
# Odoo 16 CE 主服务(挂载 OCA 会计模块)
odoo:
image: odoo:16.0
container_name: odoo16-app
depends_on:
- db
ports:
- "8069:8069"
environment:
- HOST=db
- USER=odoo
- PASSWORD=odoo20260202
# 核心:挂载自定义模块 + OCA 会计模块目录
- ADDONS_PATH=/mnt/addons,/mnt/oca-addons
volumes:
- ./config:/etc/odoo
- ./addons:/mnt/addons
- ./oca-addons:/mnt/oca-addons
- ./data/odoo:/var/lib/odoo
restart: always
mkdir -p ~/odoo16-oca/{config,addons,oca-addons,data} && cd ~/odoo16-oca
sudo chmod -R 777 ./data
sudo chown -R 1000:1000 ./addons ./oca-addons
cd ./oca-addons
git clone -b 16.0 https://gh-proxy.org/https://github.com/OCA/account-financial-t
ools.git
git clone -b 16.0 https://gh-proxy.org/https://github.com/OCA/account-financial-reporting.git
sudo chown -R 101:101 ./data/odoo
sudo chmod -R 775 ./data/odoo
git clone -b 16.0 https://gh-proxy.org/https://github.com/nguyenthitritue/Odoo-Addons.git
https://github.com/OCA/account-financial-tools/tree/16.0
Next:
https://github.com/bringout/oca-ocb-accounting/tree/16.1
https://github.com/bringout/oca-payment
https://github.com/OCA/account-invoicing/tree/16.0
https://github.com/OCA/maintainer-tools
Altinkaya Free Odoo Addons https://github.com/altinkaya-opensource/odoo-addons
你想要把之前基于「创建人(create_uid)」的权限规则,改成基于维修单上的「负责人」字段来限制用户仅查看自己作为负责人的维修单,核心是修改记录规则的域表达式,将判断字段从 create_uid 换成维修单的负责人字段。
Odoo 官方维修模块(maintenance)中,维修单(maintenance.request)的「负责人」字段默认名称是:
user_id(对应界面上的「负责人」/「Assigned to」)res.users(用户模型)进入之前创建的「维修单:仅查看自己创建的」记录规则(设置 → 技术 → 安全 → 记录规则),将「域」字段的表达式替换为以下内容:
[(‘user_id’, ‘=’, user.id)]
user_id:维修单上的「负责人」字段技术名;user_id = user.id:仅当维修单的负责人等于当前登录用户时,该记录才可见;如果需要补充场景(比如允许用户看到「负责人为空」的维修单,或同时看自己创建 + 自己负责的),可使用以下表达式:
| 需求场景 | 域表达式 | |
| :———————–: | :—————————: | :———————————————————-: |
| 仅看自己负责的 | [('user_id', '=', user.id)] | |
| 看自己负责的 + 无负责人的 | [' | ', ('user_id', '=', user.id), ('user_id', '=', False)] |
| 看自己创建的 + 自己负责的 | [' | ', ('create_uid', '=', user.id), ('user_id', '=', user.id)] |
你想要把 Odoo 维修单(maintenance.request)上的「负责人(user_id)」字段设置为只读,核心是通过修改维修单的表单视图,给 user_id 字段添加 readonly="1" 属性;如果需要更灵活的只读规则(比如仅对普通用户只读、管理员可编辑),还可以用权限表达式控制。以下是两种常用方法,按需选择。
适用于「任何用户都不能修改负责人,只能由系统 / 管理员初始化」的场景,纯界面操作即可完成。
user_id
),原始代码通常是:
%(year)s:當前年份(4 位數,如 2026)。%(y)s:當前年份(2 位數,如 26)。%(month)s:當前月份(01-12)。%(day)s:當前日期(01-31)。 範例配置:
如果您希望單號顯示為 RO/20260206/0001:
RO/%(year)s%(month)s%(day)s/序號長度 (Sequence Size):4 (這決定了後面的數字位數)。
Odoo (formerly known as OpenERP) is a suite of open-source business apps.
https://github.com/minhng92/odoo-17-docker-compose
日记帐就是每天都要登的帐明细帐是根据总帐开设科目登记的总帐是依据一级科目开设的所谓总帐,不是手工记帐下的总帐意思。而是帐务处理的意思。在总帐模块中,可以完成财务日常处理全部业务。包括制单、审核、记帐、出科目汇总表、科目总帐、明细帐等。===========================debit,credit,在会计理论中,借贷本身无意义.故会计借贷平衡则存在以下四个方面,即资产增资产减,资产增…
日记帐就是每天都要登的帐
明细帐是根据总帐开设科目登记的
总帐是依据一级科目开设的
所谓总帐,不是手工记帐下的总帐意思。而是帐务处理的意思。在总帐模块中,可以完成财务日常处理全部业务。包括制单、审核、记帐、出科目汇总表、科目总帐、明细帐等。
===========================
debit,credit,
在会计理论中,借贷本身无意义.
故会计借贷平衡则存在以下四个方面,即
资产增资产减,资产增负债(或权益)增,
负债(或权益)增负债减.负债(或权益)减资产减.
资产类、成本、费用类 会计科目金额增加就记借方,如减少就记贷方;
负债、权益、收入类 会计科目增加就记贷方,如减少就记借方。
laiyuan:
借贷本身无意义,(就好像是1读YI,但为什麽把1叫YI,而不叫其他的发音呢?这道理是一样的),但它所代表的含义是明确的,我们可以理解为增减的意思,对於资产类而言借方为增加额,贷方为减小额,对於负债或所有者权益类则贷方为增加额,借方为减少额.故会计借贷平衡则存在以下四个方面,即资产增资产减,资产增负债(或权益)增,负债(或权益)增负债减.负债(或权益)减资产减.
所以,我倒认为,在会计教学中,为了便於初学者理解,直接用增减代替借贷可能会好理解点.
例如,我借了甲方现金1000元,则我的资产增加了1000元,同时我的负债也增加了1000元.所以,借方为现金1000元,贷方为其他应付款1000元(即负债增加了1000元),同理也可以运用於其他三个会计平衡方面,一样的理解.
就如楼主所讲的例子,乙企业代收甲企业缴交消费税, ,当收到存款10元时,资产增加10元的同时,负债也增加了10元(之所以是负债,是因为这个款是代收代缴的,你迟早要付出这笔款),於是分录为借:银行存款,贷:应交税金//后来缴税的时候,资产减小了10元负债同时也减少了10元.所以就会有借:应交税金,贷:银行存款.
这种借贷的含义感觉的确和生活中的借贷含义不一样,我当初刚学时也是想不通,但我上面说了,它并无意义,有意义的是业务的性质和你分析出来的增减结果.
http://zhidao.baidu.com/question/8452779.html
基于全球开源排名第一的开源软件Compiere基础上开发的软件,开源的如果用户有这种能力完全可以开发(二次开发)POS系統、接口系统等。。。企业资源计划也叫企业资源规划(简称ERP),在 Web 上、零 售点(POS )上,您的订单被流线般地处理;您可以更合理的管理您的库存,客户管理,发票自动处……一切超乎您的想象。ComPiere为中小规模(SME)企业在全球化的分销及服务提供完整的解决方案,涵…
基于全球开源排名第一的开源软件Compiere基础上开发的软件,开源的如果用户有这种能力完全可以开发(二次开发)POS系統、接口系统等。。。
企业资源计划也叫企业资源规划(简称ERP),在 Web 上、零 售点(POS )上,您的订单被流线般地处理;您可以更合理的管理您的库存,客户管理,发票自动处……一切超乎您的想象。
ComPiere为中小规模(SME)企业在全球化的分销及服务提供完整的解决方案,涵盖了从客户管理、供应链管理到财务管理的所有领域。这一高价值的商业应用程序,易于安装、实施、使用,您甚至可以自行安装和实施这套系统(略懂 Oracle 和 Java 技术)
快速的深层次的开发,都需要花钱买技术文档的拉。。。
有很多企业很喜欢免费的erp,ok来吧 只要你能把compiere的java源码吃透,一切都是免费的。呵呵~ 可是吃完他要花多长时间呢?
我相信 对于company来说干这件事比花钱买一套系统代价更大!
我相信 对于个人来说搞定这件事情比找一份报酬更高的工作更有难度,如果真的可以摆平并达到比较理想的二次开发境界,那么对于个人已经没有留在原来的company为其提供免费erp的理由了。
对于国外的这种理念,我本人还是非常欣赏!这必然是国内software发展的一个方向,软件真的已经不是软件了!软件是服务!
ok,让我们来分析一下,当用户输入完相应信息点击’发表评论’按钮时,触发:checkcmtform() (由 可得) 代码如下: function checkcmtform() { if(checkname(“spBlogCmtor”)&&checkeandu(“spBlogCmtURL”)&&checktext(“spBlogCmtText”)&&cmtfull()) { s…
ok,让我们来分析一下,当用户输入完相应信息点击’发表评论’按钮时,触发:checkcmtform()
(由<form name=”form1″ id=”popFormSubmit” action=”/%CC%EC%CF%C2%BF%F1%C0%BD/commit” method=”post” onSubmit=”return checkcmtform()”>
可得)
代码如下:
function checkcmtform()
{
if(checkname(“spBlogCmtor”)&&checkeandu(“spBlogCmtURL”)&&checktext(“spBlogCmtText”)&&cmtfull())
{
submitForm();
return true;
}
else
{
return false;
}
}
var g_pop=null;
function submitForm()
{
g_pop=new Popup({ contentType:1,isReloadOnClose:false,width:340,height:80});
g_pop.setContent(“title”,”添加评论”);
g_pop.setContent(“contentUrl”,””);
g_pop.setContent(“someDisabledBtn”,”btn_ok”);
g_pop.build();
G(“popFormSubmit”).target=g_pop.iframeIdName;
g_pop.show();
}
function g_close_pop()
{
g_pop.close();
}
这样,一个g_pop.setContent(“title”,”添加评论”);就开始创建一个窗体,并且蒙版了一个层,防止用户误操作影响提交相关评论到后台的功能。
http://hi.baidu.com/js/popup.js
if(!Array.prototype.push){
Array.prototype.push=function(){
var startLength=this.length;
for(var i=0;i<arguments.length;i++)this[startLength+i]=arguments[i];
return this.length}};
function G(){var elements=new Array();
for(var i=0;i<arguments.length;i++)
{var element=arguments[i];if(typeof element==’string’)element=document.getElementById(element);if(arguments.length==1)return element;elements.push(element)};return elements};
Function.prototype.bind=function(object){var __method=this;return function(){__method.apply(object,arguments)}};Function.prototype.bindAsEventListener=function(object){var __method=this;return function(event){__method.call(object,event||window.event)}};Object.extend=function(destination,source){for(property in source){destination[property]=source[property]};return destination};if(!window.Event){var Event=new Object()};Object.extend(Event,{observers:false,element:function(event){return event.target||event.srcElement},isLeftClick:function(event){return(((event.which)&&(event.which==1))||((event.button)&&(event.button==1)))},pointerX:function(event){return event.pageX||(event.clientX+(document.documentElement.scrollLeft||document.body.scrollLeft))},pointerY:function(event){return event.pageY||(event.clientY+(document.documentElement.scrollTop||document.body.scrollTop))},stop:function(event){if(event.preventDefault){event.preventDefault();event.stopPropagation()}else{event.returnValue=false;event.cancelBubble=true}},findElement:function(event,tagName){var element=Event.element(event);while(element.parentNode&&(!element.tagName||(element.tagName.toUpperCase()!=tagName.toUpperCase())))element=element.parentNode;return element},_observeAndCache:function(element,name,observer,useCapture){if(!this.observers)this.observers=[];if(element.addEventListener){this.observers.push([element,name,observer,useCapture]);element.addEventListener(name,observer,useCapture)}else if(element.attachEvent){this.observers.push([element,name,observer,useCapture]);element.attachEvent(‘on’+name,observer)}},unloadCache:function(){if(!Event.observers)return;for(var i=0;i<Event.observers.length;i++){Event.stopObserving.apply(this,Event.observers[i]);Event.observers[i][0]=null};Event.observers=false},observe:function(element,name,observer,useCapture){var element=G(element);useCapture=useCapture||false;if(name==’keypress’&&(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||element.attachEvent))name=’keydown’;this._observeAndCache(element,name,observer,useCapture)},stopObserving:function(element,name,observer,useCapture){var element=G(element);useCapture=useCapture||false;if(name==’keypress’&&(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||element.detachEvent))name=’keydown’;if(element.removeEventListener){element.removeEventListener(name,observer,useCapture)}else if(element.detachEvent){element.detachEvent(‘on’+name,observer)}}});Event.observe(window,’unload’,Event.unloadCache,false);var Class=function(){var _class=function(){this.initialize.apply(this,arguments)};for(i=0;i<arguments.length;i++){superClass=arguments[i];for(member in superClass.prototype){_class.prototype[member]=superClass.prototype[member]}};_class.child=function(){return new Class(this)};_class.extend=function(f){for(property in f){_class.prototype[property]=f[property]}};return _class};function space(flag){if(flag==”begin”){var ele=document.getElementById(“ft”);if(typeof(ele)!=”undefined”&&ele!=null)ele.id=”ft_popup”;ele=document.getElementById(“usrbar”);if(typeof(ele)!=”undefined”&&ele!=null)ele.id=”usrbar_popup”}
else if(flag==”end”){var ele=document.getElementById(“ft_popup”);if(typeof(ele)!=”undefined”&&ele!=null)ele.id=”ft”;ele=document.getElementById(“usrbar_popup”);if(typeof(ele)!=”undefined”&&ele!=null)ele.id=”usrbar”}};var Popup=new Class();Popup.prototype={iframeIdName:’ifr_popup’,initialize:function(config){this.config=Object.extend({contentType:1,isHaveTitle:true,scrollType:’no’,isBackgroundCanClick:false,isSupportDraging:true,isShowShadow:true,isReloadOnClose:true,width:400,height:300},config||{});this.info={shadowWidth:4,title:””,contentUrl:””,contentHtml:””,callBack:null,parameter:null,confirmCon:””,alertCon:””,someHiddenTag:”select,object,embed”,someDisabledBtn:””,someHiddenEle:””,overlay:0,coverOpacity:40};this.color={cColor:”#EEEEEE”,bColor:”#FFFFFF”,tColor:”#709CD2″,wColor:”#FFFFFF”};this.dropClass=null;this.someToHidden=[];this.someToDisabled=[];if(!this.config.isHaveTitle)this.config.isSupportDraging=false;this.iniBuild()},setContent:function(arrt,val){if(val!=”){switch(arrt){case ‘width’:this.config.width=val;break;case ‘height’:this.config.height=val;break;case ‘title’:this.info.title=val;break;case ‘contentUrl’:this.info.contentUrl=val;break;case ‘contentHtml’:this.info.contentHtml=val;break;case ‘callBack’:this.info.callBack=val;break;case ‘parameter’:this.info.parameter=val;break;case ‘confirmCon’:this.info.confirmCon=val;break;case ‘alertCon’:this.info.alertCon=val;break;case ‘someHiddenTag’:this.info.someHiddenTag=val;break;case ‘someHiddenEle’:this.info.someHiddenEle=val;break;case ‘someDisabledBtn’:this.info.someDisabledBtn=val;break;case ‘overlay’:this.info.overlay=val}}},iniBuild:function(){G(‘dialogCase’)?G(‘dialogCase’).parentNode.removeChild(G(‘dialogCase’)):function(){};var oDiv=document.createElement(‘span’);oDiv.id=’dialogCase’;
document.body.appendChild(oDiv)},build:function(){var baseZIndex=10001+this.info.overlay*10;var showZIndex=baseZIndex+2;this.iframeIdName=’ifr_popup’+this.info.overlay;var path=”http://img.baidu.com/hi/img/”;var close=’‘;var cB=’filter: alpha(opacity=’+this.info.coverOpacity+’);opacity:’+this.info.coverOpacity/100+’;’;var cover=’
‘;var mainBox=’
‘+’
‘;if(!this.config.isBackgroundCanClick){G(‘dialogCase’).innerHTML=cover+mainBox;G(‘dialogBoxBG’).style.height=document.body.scrollHeight}else G(‘dialogCase’).innerHTML=mainBox;Event.observe(G(‘dialogBoxClose’),”click”,this.reset.bindAsEventListener(this),false);if(this.config.isSupportDraging){dropClass=new Dragdrop(this.config.width,this.config.height,this.info.shadowWidth,this.config.isSupportDraging,this.config.contentType);G(“dialogBoxTitle”).style.cursor=”move”};this.lastBuild()},lastBuild:function(){var confirm=’
‘;var alert=’
‘;var baseZIndex=10001+this.info.overlay*10;var coverIfZIndex=baseZIndex+4;if(this.config.contentType==1){var openIframe=”
“;var coverIframe=”
else if(this.config.contentType==4){G(“dialogBody”).innerHTML=alert;Event.observe(G(‘dialogYES’),”click”,this.close.bindAsEventListener(this),false)}},reBuild:function(){G(‘dialogBody’).height=G(‘dialogBody’).clientHeight;this.lastBuild()},show:function(){this.hiddenSome();this.middle();if(this.config.isShowShadow)this.shadow()},forCallback:function(){return this.info.callBack(this.info.parameter)},shadow:function(){var oShadow=G(‘dialogBoxShadow’);var oDialog=G(‘dialogBox’);oShadow[‘style’][‘position’]=”absolute”;oShadow[‘style’][‘background’]=”#000″;oShadow[‘style’][‘display’]=””;oShadow[‘style’][‘opacity’]=”0.2″;oShadow[‘style’][‘filter’]=”alpha(opacity=20)”;oShadow[‘style’][‘top’]=oDialog.offsetTop+this.info.shadowWidth;oShadow[‘style’][‘left’]=oDialog.offsetLeft+this.info.shadowWidth;oShadow[‘style’][‘width’]=oDialog.offsetWidth;oShadow[‘style’][‘height’]=oDialog.offsetHeight},middle:function(){if(!this.config.isBackgroundCanClick)G(‘dialogBoxBG’).style.display=”;var oDialog=G(‘dialogBox’);oDialog[‘style’][‘position’]=”absolute”;oDialog[‘style’][‘display’]=”;var sClientWidth=document.body.clientWidth;var sClientHeight=document.body.clientHeight;var sScrollTop=document.body.scrollTop;var sleft=(document.body.clientWidth/2)-(oDialog.offsetWidth/2);var iTop=-80+(sClientHeight/2+sScrollTop)-(oDialog.offsetHeight/2);var sTop=iTop>0?iTop:(sClientHeight/2+sScrollTop)-(oDialog.offsetHeight/2);if(sTop<1)sTop="20";if(sleft<1)sleft="20";oDialog['style']['left']=sleft;oDialog['style']['top']=sTop},reset:function(){if(this.config.isReloadOnClose){top.location.reload()};this.close()},close:function(){G('dialogBox').style.display='none';if(!this.config.isBackgroundCanClick)G('dialogBoxBG').style.display='none';if(this.config.isShowShadow)G('dialogBoxShadow').style.display='none';G('dialogBody').innerHTML='';this.showSome()},hiddenSome:function(){var tag=this.info.someHiddenTag.split(",");if(tag.length==1&&tag[0]=="")tag.length=0;for(var i=0;i
说白了还是用了prototype库变了一下向来实现一个窗口,这样增强了用户体验。
在netsuite中,当你的脚本写得操作100多行时,我感觉就很有必要由一个蒙版层在引导用户操作。
防止用户在相关事务没有处理完之前关闭或者刷新了该窗体。
比如我在设计多币种报价时,用户的需求:必须是随意的用户切换主界面上的币种字段时,来完成所有这张销售订单货品的币种换算工作,
这样无论你如何优化这个脚本,系统还是需要时间去读去相关的汇率信息,然后完成换算,在赋值结束操作。
在运算过程中就很有必要添加一个用户增强用户体验度的窗体,提示用户,耐心等候。
[http://www.totemsuite.com/SAAS](http://www.totemsuite.com/SAAS)
author:zeng.chuanzhuo
footer_actions 是netsuite中 所有系统列表form页面都存在的对象,就是页脚那些可以用来排序,过滤等等的对象,我们可以对这些对象进行操作,包括定制,系统完成您操作后的动态刷新当前页面的功能。这个四个对象是包括在form:foot_actions中的,是四个隐藏的对象,在界面上无法查看到,是系统内置的用来动态管理其自身功能的变量。比如在导出时候:document.forms[‘…
footer_actions 是netsuite中 所有系统列表form页面都存在的对象,就是页脚那些可以用来排序,过滤等等的对象,我们可以对这些对象进行操作,包括定制,系统完成您操作后的动态刷新当前页面的功能。
<input type=hidden name=’sortcol’ value=’Transaction_TRANDATE_raw’>
<input type=hidden name=’sortdir’ value=’ASC’>
<input type=hidden name=’csv’ value=’HTML’>
<input type=hidden name=’OfficeXML’ value=’F’>
这个四个对象是包括在form:foot_actions中的,是四个隐藏的对象,在界面上无法查看到,是系统内置的用来动态管理其自身功能的变量。
比如在导出时候:
document.forms[‘footer_actions’].elements.csv.value=’Export’;
//document.forms[‘footer_actions’].elements.OfficeXML.value=’F’;
document.location.replace(appendFormDataToURL(‘/app/accounting/transactions/transactionlist.csv?searchtype=Transaction’));
csv被变成Export时,在用appendFormDataToURL才会发生导出动作哦!~
function appendFormDataToURL(url,omit) {
var footer = document.getElementById(‘div__footer’);
var elem, frm = parent.document.forms[‘footer_actions’];
if (isValEmpty(url)) url = ”
for (var i = 0; i < frm.elements.length; i++) {
elem = frm.elements[i];
if (elem.name.length == 0 || elem.name == omit || elem.name.indexOf(‘inpt_’) == 0) continue;
if (elem.type==’select-one’)
url = addParamToURL(url, elem.name, escape(parent.getSelectValue(elem)));
else if (isMultiSelect(elem))
url = addParamToURL(url, elem.name, escape(getMultiSelectValues(elem)));
else if (elem.type==’radio’)
url = addParamToURL(url, elem.name, escape(getRadioValue(elem)));
else if (elem.type==’checkbox’)
url = addParamToURL(url, elem.name, (elem.checked ? ‘T’ : ‘F’));
else if (elem.type==’text’)
url = addParamToURL(url, elem.name, escape(elem.value));
else if (elem.type==’hidden’ && elem.name != ‘frame’)
url = addParamToURL(url, elem.name, encode(elem.value));
}
return url; }
这个隐含的API中调用到了系统公开的一个API:addParamToURL和一个escape方法:
addParamToURL(param, value, dynamic)
Adds a URL parameter to this column. Should only be called after calling setURL(xxx)
Parameters
? param {string} – The parameter name added to the URL
? value {string} – The parameter value added to the URL
? dynamic {boolean} – If true, then the parameter value is actually an alias that is
calculated per row
————————
对 String 对象编码以便它们能在所有计算机上可读,
**escape(**_charString_**)**
必选项 charstring 参数是要编码的任意 String 对象或文字。
escape 方法返回一个包含了 charstring 内容的字符串值( Unicode 格式)。所有空格、标点、重音符号以及其他非 ASCII 字符都用 %xx 编码代替,其中 xx 等于表示该字符的十六进制数。例如,空格返回的是 “%20” 。
字符值大于 255 的以 %uxxxx 格式存储。
注意 escape 方法不能够用来对统一资源标示码 (URI) 进行编码。对其编码应使用 encodeURI 和encodeURIComponent 方法。
版本 1
encodeURI 方法 | encodeURIComponent 方法 |String 对象 | unescape 方法
Zach Nelson 扎克-尼尔森 is comming..netsuite中国 http://www.totemsuite.comI will show him the most important Product Developed by TotemSuite(SuiteTalk).:Dear Respected Zach , Glad to see you, I am pleased to…
Zach Nelson 扎克-尼尔森 is comming..
netsuite中国 http://www.totemsuite.com
I will show him the most important Product Developed by TotemSuite(SuiteTalk).
:Dear Respected Zach , Glad to see you, I am pleased to be able to introduce the solution provided by TotemSuite.I will show you in three Part . ok, let’s begin?
1. First part is about offline client , This application is design for offline some part of NetSuite Database, For Example , the customer record, the addressbook and the contact information, the activity data include event、task, The transaction offline is for supportcase.
user can new or edit all of these data without Internet which can’t get that in some of hometowns in China. then update the data to NetSuite online database, synchronize these data the target of design the application.
This solution is prepare for customer’ company handle some offline operation.
2.The secend part is about finacal intergration to Chinese local FinanceSystem , export some of NetSuite transactions to a China standard format.I will show you that , this’s the file.
This solution is prepare for Chinese Finance customization. With solution we can use NetSuite to print Chinese local invoice. include SuiteScript solution Online Export and Suitetalk Online search and batch export.
3.The third part is about ,website intergration , use can design the website using powerfull CMS ( Content Management System ) system. then integrate the item data to NetSuite ERP,Transaction date synchronize to NetSuite database.
This solution is prepare for Chinese b2b、b2c Ecommerce mode web store, use the localize Content Management System Intergrate with NetSuite powerful ERP and CRM. We can handle almost any Demand of our customer In WebSite Field.
This is the end of my introduce, I hope you liked it. Thanks
VLOOKUP函数对查找内容列排序增加效率, 默认是认为true,即已经排序,只从上到下查找一遍即可。效率很高, 而如果false,精确匹配值。 关于VLOOKUP函数的用法 “Lookup”的汉语意思是”查找”,在Excel中与”Lookup”相关的函数有三个:VLOOKUP、HLOOKUO和LOOKUP。下面介绍VLOOKUP函数的用法。 一、功能 在表格的首列查找指定的数据,并返回…
VLOOKUP函数对查找内容列排序增加效率,
默认是认为true,即已经排序,只从上到下查找一遍即可。效率很高,
而如果false,精确匹配值。
关于VLOOKUP函数的用法
“Lookup”的汉语意思是”查找”,在Excel中与”Lookup”相关的函数有三个:VLOOKUP、HLOOKUO和LOOKUP。下面介绍VLOOKUP函数的用法。
一、功能
在表格的首列查找指定的数据,并返回指定的数据所在行中的指定列处的数据。
二、语法
标准格式:
VLOOKUP(lookup_value,table_array,col_index_num , range_lookup)
三、语法解释
VLOOKUP(lookup_value,table_array,col_index_num,range_lookup)可以写为:
VLOOKUP(需在第一列中查找的数据,需要在其中查找数据的数据表,需返回某列值的列号,逻辑值True或False)
1.Lookup_value为”需在数据表第一列中查找的数据”,可以是数值、文本字符串或引用。
2.Table_array 为”需要在其中查找数据的数据表”,可以使用单元格区域或区域名称等。
⑴如果 range_lookup 为 TRUE或省略,则 table_array 的第一列中的数值必须按升序排列,否则,函数 VLOOKUP 不能返回正确的数值。
如果 range_lookup 为 FALSE,table_array 不必进行排序。
⑵Table_array 的第一列中的数值可以为文本、数字或逻辑值。若为文本时,不区分文本的大小写。
3.Col_index_num 为table_array 中待返回的匹配值的列序号。
Col_index_num 为 1 时,返回 table_array 第一列中的数值;
Col_index_num 为 2 时,返回 table_array 第二列中的数值,以此类推。
如果Col_index_num 小于 1,函数 VLOOKUP 返回错误值 #VALUE!;
如果Col_index_num 大于 table_array 的列数,函数 VLOOKUP 返回错误值 #REF!。
4.Range_lookup 为一逻辑值,指明函数 VLOOKUP 返回时是精确匹配还是近似匹配。如果为 TRUE 或省略,则返回近似匹配值,也就是说,如果找不到精确匹配值,则返回小于lookup_value 的最大数值;如果 range_value 为 FALSE,函数 VLOOKUP 将返回精确匹配值。如果找不到,则返回错误值 #N/A。
四、应用例子
A B C D
1 编号 姓名 工资 科室
2 2005001 周杰伦 2870 办公室
3 2005002 萧亚轩 2750 人事科
4 2005006 郑智化 2680 供应科
5 2005010 屠洪刚 2980 销售科
6 2005019 孙楠 2530 财务科
7 2005036 孟庭苇 2200 工 会
A列已排序(第四个参数缺省或用TRUE)
VLOOKUP(2005001,A1:D7,2,TRUE) 等于”周杰伦”
VLOOKUP(2005001,A1:D7,3,TRUE) 等于”2870″
VLOOKUP(2005001,A1:D7,4,TRUE) 等于”办公室”
VLOOKUP(2005019,A1:D7,2,TRUE) 等于”孙楠”
VLOOKUP(2005036,A1:D7,3,TRUE) 等于”2200″
VLOOKUP(2005036,A1:D7,4,TRUE) 等于”工 会”
VLOOKUP(2005036,A1:D7,4) 等于”工 会”
若A列没有排序,要得出正确的结果,第四个参数必须用FALSE
VLOOKUP(2005001,A1:D7,2,FALSE) 等于”周杰伦”
VLOOKUP(2005001,A1:D7,3,FALSE) 等于”2870″
VLOOKUP(2005001,A1:D7,4,FALSE) 等于”办公室”
VLOOKUP(2005019,A1:D7,2,FALSE) 等于”孙楠”
VLOOKUP(2005036,A1:D7,3,FALSE) 等于”2200″
VLOOKUP(2005036,A1:D7,4,FALSE) 等于”工 会”
五、关于TRUE和FALSE的应用
先举个例子,假如让你在数万条记录的表格中查找给定编号的某个人,假如编号已按由小到大的顺序排序,你会很轻松地找到这个人;假如编号没有排序,你只好从上到下一条一条地查找,很费事。
用VLOOKUP查找数据也是这样,当第一列已排序,第四个参数用TRUE(或确省),Excel会很轻松地找到数据,效率较高。当第一列没有排序,第四个参数用FALSE,Excel会从上到下一条一条地查找,效率较低。
2008-12-12Agenda Topics – Day OneWelcomeCourse objectivesTopics and Agenda for entire courseNavigating the ApplicationLogging into NetSuiteGetting around the applicationLists vs. Transactions vs. Setu…
2008-12-12
Agenda Topics – Day One
Welcome
Navigating the Application
Break
Navigating the Application continued…
NetSuite Users and Roles
Lunch and Break
Managing Your Activities and Calendar
General Ledge
· Creating journal entries
· Journal entry approval
· Viewing the G/L impact of transactions
· Creating memorized transactions
· Enter memorized transactions
· Financial reporting
· Student Exercises (15 minutes)
Accounts Payable
Break
Accounts Receivable
Purchasing
Agenda Topics – Day Two
Inventory Management
· Multi-location inventory
· Volume Pricing for Multiple Units of Measure
· Re-order point Reminders
· Inventory Adjustment
· Inventory Transfer
· Receive Purchase Order
· Fulfill Sales Orders
· Create Current Inventory Status Report
· Student Exercises (15 minutes)
Sales Order
· Student Exercises (15 minutes)
Break
Sales Force Automation
Lunch and Break
Sales Force Automation continued…
· Student Exercises (15 minutes)
Marketing Automation
Break
Special Point One
· sales item configuration,
· customer database configuration,
· accounts (for bookkeeping) configuration
·
Special Point Two
· customizing forms for sales contract,
· customizing forms for delivery slip,
· customizing forms for quotes
· customizing forms for invoices
Summary and Conclusion
Path:Customization > Scripting > Scripts > NewLimitation:Client script can’t apply to Assembly and Kit item type, Even in Netsuite 2014.2 versionOptio…
Path:
Customization > Scripting > Scripts > New
Limitation:
Client script can’t apply to Assembly and Kit item type, Even in Netsuite 2014.2 version
Option:
– In the custom form of Assembly or Kit item, you will be able to apply scripts related to those item type
–